Option to connect to all IPs behind a hostname in parallel

This introduces a `ConnectionStrategy` interface for creating connections to a `Route`. The default `SimpleConnectionStrategy` implemention preserves the old behavior, passing along hostnames to Socket which will chose one of the underlying IPs. The `ParallelConnectionStrategy` implementation will initiate a TCP handshake to each IP concurrently and return the first connection to complete.

I tested `ParallelConnectionStrategy` with our API endpoint and got the datacenter I'm close to, as expected, and the time it look was comparable to my RTT to that datacenter (5-15ms in most cases).

Somewhat related to issue #506 (Happy Eyeballs).
I added a case for `addressesToTry.size() == 1`. If there's a proxy, I'm debating whether it's worth it to attempt dns resolution anyway.

- if there proxy is used to get past a firewall which would block our dns request, it would be best to not waste time trying to resolve the hostname ourselves
- OTOH if proxy is used for privacy or to get around geographic restrictions, we should be able to do resolution ourselves and find the IP with lowest latency

What do you think?