add Stoplight.Color() ext for logging
merge guard statement
implement Envelope.Dispose that calls SafeUnlock
extract DedicatedMultiThreadRunner from DedicatedMultiThreadEnvelopeProcessor
Merge branch 'easy-cpu-when-queues-are-empty' into multi-threaded-queue-feed
make one instance of DedicatedMultiThreadRunner usable by several consumers

use Run to define thread info, source and action
only class state is stoplight
extract IMultiThreadRunner and rename DedicatedMultiThreadEnvelopeProcessor to MultiThreadEnvelopeProcessor

different threading models from this point forward should be implemented as IMultiThreadRunner instead of IEnvelopeProcessor
QueueFeed -> QueuePartitionFeed, QueueContext -> QueuePartitionContext, etc

- also broke QueueFeed.GetQueues into an iteratator method and two different locking strategy methods
Merge branch 'master' into multi-threaded-queue-feed
fix metrics key
remove 'Created' from subscriber names
move tests to appropriate folder
fix constraint names
add IsLatest to HubType and Subscriber
add SubscriberRegistration and first test infrastructure
add HubSnaptshot Table.InsertRange
RegisterSubscribers_should_update_subscribers_table

opted for one test to update empty and then populated table because the setup for the latter was identical to the test for the former
use SubscriberRegistration to register subscribers
add PartitionSnapshot
fix Subscriber.Latest to work in partition dbs too