Heavily refactor the `Peer` module

The same thing that will be done with `Tracker.Client` (porting to use
`conduit`) will have to be done here, but I'm committing it all to keep
it version controlled, since that's always good practice.