Implement Ping Command

WIP, but works for me.

Ideally we'd only send a ping when we haven't sent or received anything in a defined interval (as was done with TCP keepalives), but that's difficult.

The ping count mostly works but there's some race condition where it doesn't. I think `RelayConnection.pingWriter` also gets started multiple times, and I'm not quite sure how `PongHandler.failedPings` gets initialized to 0 on reconnect, but it does.