message: chore(async-rewriter2): skip subtrees where possible
  There might be more to improve here, but these seemed like two
  instances of low-hanging fruit where we could improve performance
  a bit by skipping full subtrees instead of re-visiting them again.
diff: @@ -351,6 +351,14 @@ export default ({ types: t }: { types: typeof BabelTypes }): babel.PluginObj<{ f
  t.returnStatement(path.node)
  ]));
  }
  +
  + // If there is a [isGeneratedHelper] between the function we're in
  + // and this node, that means we've already handled this node.
  + if (path.find(
  + path => path.isFunction() || !!path.node[isGeneratedHelper]
  + )?.node?.[isGeneratedHelper]) {
  + return path.skip();
  + }
  },
  exit(path) {
  // We have seen an expression. If we're not inside an async function,
  @@ -395,14 +403,6 @@ export default ({ types: t }: { types: typeof BabelTypes }): babel.PluginObj<{ f
  identifierGroup = path.getFunctionParent().getData(identifierGroupKey);
  }
  - // If there is a [isGeneratedHelper] between the function we're in
  - // and this node, that means we've already handled this node.
  - if (path.find(
  - path => path.isFunction() || !!path.node[isGeneratedHelper]
  - ).node[isGeneratedHelper]) {
  - return;
  - }
  -
  // Do not transform foo.bar() into (expr = foo.bar, ... ? await expr : expr)(),
  // because that would mean that the `this` value inside the function is
  // incorrect. This would be hard to get right, but it should be okay for now
  @@ -501,6 +501,8 @@ export default ({ types: t }: { types: typeof BabelTypes }): babel.PluginObj<{ f
  }),
  { [isGeneratedHelper]: true }
  ));
  + // We are exiting from the current path and don't need to visit it again.
  + path.skip();
  }
  },
  CatchClause: {
  