Refactored gitsyncd.ReceiveChanges into separate components

Instead of forcing all handling into one function, we can now use the ChangeBus
to allow any number of listeners to sink changes. This will help encapsulate
concerns and allow more runtime changes to the change propagation (e.g. generate
events for multiple repos or add new listeners while running).