GraphQL resolver emulation should cascade
Currently our GraphQL resolver emulation works on a field-by-field basis; so if a field doesn't have a resolver (or uses the default resolver) then it will NOT use resolver emulation, and will resolve with a default Grafast plan instead. This generally works fine, but the default Grafast plan does not implement resolver-style polymorphism, so if polymorphism is involved things can go wrong.

Grafast should be smarter; if you request a field that has a GraphQL resolver, then every field below that should be seen as having a GraphQL resolver (even if it's just the `defaultFieldResolver`) until we reach a field that explicitly has a Grafast plan. We should carry a `resolverEmulation` state through the query planning.

To do so (starting with `resolverEmulation = false`):

https://github.com/graphile/crystal/blob/ab3ac2259d00af95be81fdd8916bff5e9340be01/grafast/grafast/src/engine/OperationPlan.ts#L1049

^ After this line, we should turn `resolverEmulation` back off if the field explicitly has a plan:
```ts
if (rawPlanResolver) {
  resolverEmulation = false
}
```

https://github.com/graphile/crystal/blob/ab3ac2259d00af95be81fdd8916bff5e9340be01/grafast/grafast/src/engine/OperationPlan.ts#L1067

^ Instead of this line, we should force the field to be seen as having a resolver if we're in `resolverEmulation` mode:

```ts
      const resolver = usesDefaultResolver && !resolverEmulation ? null : resolvedResolver ?? defaultFieldResolver;
```

https://github.com/graphile/crystal/blob/ab3ac2259d00af95be81fdd8916bff5e9340be01/grafast/grafast/src/engine/OperationPlan.ts#L1199

^ After this `if` we should enter `resolverEmulation` mode

```ts
if (resolver !== null) {
  resolverEmulation = true
```

Then the boolean needs passing down to the next level of query planning by adding it as a parameter here:

https://github.com/graphile/crystal/blob/ab3ac2259d00af95be81fdd8916bff5e9340be01/grafast/grafast/src/engine/OperationPlan.ts#L1235-L1250