## Features

- Add `on_subgraph_request` hook in the `HooksExtension`, called before any GraphQL request to subgraphs.
- Add `OnRequestOutput` returned by `HooksExtension.on_request` which allows to specify the contract key dynamically.
- Add `ContractsExtension` which defines both the directives used to generate a schema contract, like `@tag`, and the function defining whether
  elements decorated with them should be included or not given their arguments and the contract key. The resulting schema will be cached by the gateway.

In the test SDK:

- removed the `enable_stdout()`, etc. methods of the `TestGatewayBuilder`. Instead, enable those in the provided TOML config with:

```toml
[extensions.my-ext]
stdout = true
```

- Added an `introspect` method to the `TestGateway` to more easily test `ContractsExtension`.
- Added the possibility to install other extensions within a test, calling `grafbase extension install` if necessary.

## Breaking Changes

- `OwnedHttpHeaders` and `SharedHttpHeaders` have been simplified and merged into `Headers`. `GatewayHeaders` and `SubraphHeaders` and now simple type aliases.
- Events from the event queue expose their fields directly, and `ExecutedSubgraphRequest.executions` has been changed to `into_executions` taking ownership of the struct.
-

## Fixes

- Structured logs do not stringify all fields anymore
