This PR replaces the `ClientOption` interface and all its conformers
with a new struct-based configuration. This has several benefits:
- Enforces that exactly one protocol implementation (Connect or
gRPC-Web) is specified at compile-time. Prior, any number could be
specified and would cause invalid requests to be serialized
- Enforces that either both the minimum compression size threshold and
compression pool are specified for requests, or neither
- Clearer default values (defaults can be seen simply by looking at
`ProtocolClientConfig.init`)
- Removes the need for some types like `IdentityCompressionPool`
The original approach was taken to more clearly mirror Go, but this new
implementation is better for Swift.