static _traverse(tree, cb) {
    /**
     * @param {LH.Artifacts.CriticalRequestNode} node
     * @param {number} depth
     * @param {number=} networkRequestTime
     * @param {number=} transferSize
     */
    function walk(node, depth, networkRequestTime, transferSize = 0) {
      const children = Object.keys(node);
      if (children.length === 0) {
        return;
      }
      children.forEach(id => {
        const child = node[id];
        if (!networkRequestTime) {
          networkRequestTime = child.request.networkRequestTime;
        }

        // Call the callback with the info for this child.
        cb({
          depth,
          id,
          node: child,
          chainDuration: child.request.networkEndTime - networkRequestTime,
          chainTransferSize: transferSize + child.request.transferSize,
        });

        // Carry on walking.
        if (child.children) {
          walk(child.children, depth + 1, networkRequestTime);
        }
      }, '');
    }

    walk(tree, 0);
  }
@param {LH.Artifacts.CriticalRequestNode} tree
@param {function(CrcNodeInfo): void} cb