Refactor QUIC server and peer discovery into separate crate

This would make it possible to use the peer discovery / hole-punching logic for other projects.

Roughly, everything in src/connections except for rpc and speedometer would go in a separate library crate.

Since quinn::Connection can be cloned, we can give the caller a connection to handle, and await connection.closed() to then handle what happens on close (eg: removing peer from peers map and attempting to reconnect).

Tricky parts:

  • UI events (some of these come from the connection handler)
  • Storage (known peeers are stored in the persistent db - this needs to be handled externally)