At this stage I'm not entirely happy about returning a plain `Version` if negotiation fails. If it succeeds we return an `AcceptedVersion` instance. It seems like this should be a `RejectedVersion` type but this would imply that the version number it contains is rejected whereas actually the version returned should be the server's default version, so `ServerDefaultVersion` perhaps?