Work on Consumer and Fetcher refactoring

- Consumer knows nothing of Fetcher
- Consumer retrieves and subscribes to all TopicPartitions when subscribed to
- Fetcher broadcasts partition errors so Router can update the PartitionStateChanges
- Fetcher tracks subscribed TopicPartitions and removes them when they unsubscribe (on error)
- TopicPartition gets and tracks its own offset. As messages pass through, it updates the offset
- PartitionRecoveryMonitor is completely event driven. It subscribes to PartitionStateChanges and tracks partitions that are "down"
Merge remote-tracking branch 'origin/master'

Conflicts:
	src/Router.cs