SchemaExtension observes or wraps the phases of an operation — parsing,
validation, execution, and each field resolve — and can contribute data to the
response extensions map. Pass instances (or classes) to Schema(extensions=[...]).
on_operation, on_parse, on_validate, on_execute) are
generators that yield once around the phase; resolve wraps each field and must
call next_. Hooks may be sync or async. When no extension overrides resolve, the
executor skips the wrapper entirely, so the feature is zero-cost when unused.
Anything returned from get_results() is merged into ExecutionResult.extensions.
Apollo tracing and OpenTelemetry are built on this hook.