Show "connecting" state for pending contacts

This branch adds a new RendezvousPollEvent and a method for getting the last time each pending contact was polled. These allow the UI to show a "connecting" state for pending contacts that were recently polled.

Responsibility for broadcasting PendingContactStateChangedEvents is moved to the rendezvous poller, which already has the necessary information and a worker thread that makes it simpler to resolve edge cases, such as a connection opening or failing after a pending contact has expired. States are cached by the contact manager to maintain the existing API.