Reviewed-on: #6
Refactors the tracker to expose an interface and an implementation type. Decoupling these will let us inject new state/functionality transparently to the client function. Reviewed-on: #3