Heavily refactor the `Tracker.Client` module

This makes several structural changes to the `Tracker.Client` module.
I think the new structure should allow us to write much more decoupled
peer code, but it's still completely non fault tolerant.

I suppose we at least now have room to grow without changing too much
user code.