This is used to adapt an endpoint so that it can be used as a key for sockets. It must
meet two requirements: (1) implement hash and equals in a way that reflects socket identity
(ie using address and port); (2) allow access to the endpoint for use in the socket factory.
For simplicity we also expose the connector, address and port directly.