Fix a wrong lock, spotted by Andreas
Rewrite how peer group manages connections and its internal thread:

- No longer uses Guava services, the change is source compatible but the two-step API is no longer needed

- Now has a dedicated ScheduledExecutorService as its core service thread, so we can schedule jobs for the future instead of using sleeps.

- Connection code was rewritten to be easier to follow (at least I think so).

The goal here is to generalise the peer group thread so it can do more things.
Don't hold the peergroup lock whilst calculating bloom filters, and run on the executor thread. Move responsibility for deduplication into recalculateFastCatchupAndFilter().
Replace peerGroup.startAsync/awaitRunning with start() and awaitTerminated with stop().
PeerGroup: Reimplement pinging to use the executor. New code is simpler and more correct.