OF-3283: Wait for outgoing route teardown before re-establishing S2S routes
Before establishing a new outgoing server session, wait for any existing route for the domain pair to finish tearing down.
For local routes, continue to use the connection close future to wait until all close processing has completed, including route-removal listeners.
For remote routes, this comitm adds a poll on the routing table until a closing route disappears or is replaced.
While holding the cluster lock, reuse any route that was created in parallel. If that route is already closed or closing, fail fast instead of reusing it. This is likely an edge case that doesn't happen in production.
This reduces the chance of colliding with stale routing state during route teardown while keeping the route reuse logic simple.
OF-3283: Reuse clustered outgoing server routes in OutgoingSessionPromise
Re-check the routing table while holding the serversCache lock before authenticating a domain in OutgoingSessionPromise.
This allows a node to reuse an outgoing server route that was created by another cluster node while waiting for the lock, instead of attempting a redundant authentication.