async function resolveGathererToDefn(gathererJson, coreGathererList, configDir) {
  const gathererDefn = expandGathererShorthand(gathererJson);
  if (gathererDefn.instance) {
    return {
      instance: gathererDefn.instance,
      implementation: gathererDefn.implementation,
      path: gathererDefn.path,
    };
  } else if (gathererDefn.implementation) {
    const GathererClass = gathererDefn.implementation;
    return {
      instance: new GathererClass(),
      implementation: gathererDefn.implementation,
      path: gathererDefn.path,
    };
  } else if (gathererDefn.path) {
    const path = gathererDefn.path;
    return requireGatherer(path, coreGathererList, configDir);
  } else {
    throw new Error('Invalid expanded Gatherer: ' + JSON.stringify(gathererDefn));
  }
}
Turns a GathererJson into a GathererDefn which involves a few main steps:
   - Expanding the JSON shorthand the full definition format.
   - `require`ing in the implementation.
   - Creating a gatherer instance from the implementation.
@param {LH.Config.GathererJson} gathererJson
@param {Array<string>} coreGathererList
@param {string=} configDir
@return {Promise<LH.Config.AnyGathererDefn>}