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)