Add a mechanism for performing handshakes in parallel

- Converts `RouteSelector` into an interface (the original implementation is now `SimpleRouteSelector`)
- Adds `EagerRouteSelector` which wraps `SimpleRouteSelector`, but eagerly initiates handshakes to multiple routes, and returns them in order of completion

Similar to #1007, but this lets us compare the latency of all `Route`s (which may involve different proxy servers, for example) rather than just comparing destination IPs.
(I didn't really change anything here)