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 with this change we'd be comparing the latency of all `Route`s (which may involve different proxy servers, for example) rather than just comparing destination IPs.
+`public`, same story