traverse each top-level thing, depth-first. for fragments, build a stack of "spread" references to be executed later
1a. so first it gets the query operation, then the F0, F1, etc
1b. each top-level object (operation, fragment) has a tree of nodes with "selections"
when it starts processing fragments, it hits a lazy reducer which enumerates all of the schema types / interfaces (FragmentWithTypeStrategy)
2a. when it enters visiting a FragmentDefinition, it pushes it on the fragments stack
when it gets to a Field under a fragment, the Node:Field.enter visitor looks up that field from the parent irep node or else creates a new irep node. it pushes it on the @nodes stack, and pushes empty parent directives? is that right? at this point, the Field AST node has directives as child AST nodes, which get traversed next
when it visits the Directive AST node, it makes an irep node and pushes it on the @parent_nodes stack
Arguments are children of the Directive AST, which is visited next. things unwind. ba