static shouldPreloadRequest(request, mainResource, initiatorPath) {
    const mainResourceDepth = mainResource.redirects ? mainResource.redirects.length : 0;

    // If it's already preloaded, no need to recommend it.
    if (request.isLinkPreload) return false;
    // It's not critical, don't recommend it.
    if (!CriticalRequestChains.isCritical(request, mainResource)) return false;
    // It's not a request loaded over the network, don't recommend it.
    if (NetworkRequest.isNonNetworkRequest(request)) return false;
    // It's not at the right depth, don't recommend it.
    if (initiatorPath.length !== mainResourceDepth + 2) return false;
    // It's not a request for the main frame, it wouldn't get reused even if you did preload it.
    if (request.frameId !== mainResource.frameId) return false;
    // We survived everything else, just check that it's a first party request.
    return UrlUtils.rootDomainsMatch(request.url, mainResource.url);
  }
We want to preload all first party critical requests at depth 2.
Third party requests can be tricky to know the URL ahead of time.
Critical requests at depth 1 would already be identified by the browser for preloading.
Critical requests deeper than depth 2 are more likely to be a case-by-case basis such that it
would be a little risky to recommend blindly.

@param {Lantern.Types.NetworkRequest} request
@param {Lantern.Types.NetworkRequest} mainResource
@param {Array<LH.Gatherer.Simulation.GraphNode>} initiatorPath
@return {boolean}