Properly clean up when connection fails before being opened.

This can happen when we attempt to connect to a RegionServer, and we
buffer some RPCs to send once connected, but we never successfully
connect, because of a connection timeout.

Bug reported by Viral Bajaria.
Properly report which RPC has failed in HasFailedRpcException.

Under certain failure modes, the current code would make an RPC
fail with an exception that claims that it's a `getClosestRowBefore'
RPC that failed, because the META or ROOT lookup that was required
to serve the RPC the user actually wanted to send failed.  This
complicates error handling for the user, as it's more convenient
for them to get a reference back to their own RPC so that they can
retry it if they want to.
Fix a small race condition when looking up the ROOT region.

There was a check-and-act sequence on the ZooKeeper object
without acquiring the appropriate lock, which means that
we could potentially cause a NullPointerException while
retrying to lookup ROOT.

Also move the ZooKeeper callback into a real class instead
of an anonymous class.