Fix ConcurrentModificationException when user supplied Executor has more than 1 thread

The stale connection management assumes that its internal map will be accessed by only one thread at a time. But this is not always true; a user can provide an Executor that is backed by a thread pool. This synchronizes around the map put/remove to prevent ConcurrentModificationExceptions.