Add support for InetSocketAddress

Supports serialization and deserialization of `InetSocketAddress`.

For serialization:

  * When available, the hostname will be preferred over the IP address.
  * When serializing an IPv6 address, it will be surrounded by brackets to disambiguate the address from the port,

        e.g. [2001:db8:85a3:8d3:1319:8a2e:370:7348]:443

For deserialization:

  * When a port is present, IPv6 addresses must be bracketed (as above) in order to discern the address from the port.
  * When no port is present, IPv6 addresses may be unbracketed.
  * Addresses are optionally followed by a colon and a port number.

Closes #48