MessageDirector: Use map<channel, list<participant>> for single channels.
TODO: Create BST type structure to handle ranges, and interface with it as necessary.
BUG: Tests stall indefinitely at around

        # Send messages on a few channels on c2, see which ones c1 gets.
        def check_channels(channels):
            for channel, should_receive in channels:
                dg = Datagram.create([channel], 123456789, 5858)
                dg.add_uint16(channel) # For some semblance of uniqueness
                self.c2.send(dg)
                if should_receive:
                    self.assertTrue(self.c1.expect(dg))
                    self.assertTrue(self.c1.expect_none()) # No repeats!
                else:
                    self.assertTrue(self.c1.expect_none())
                # And, of course, l1 receives all of these:
                self.assertTrue(self.l1.expect(dg))
        check_channels([
            (500, False),
            (999, False),
            (1000, True),
            (1001, True),
            (1299, True),
            (1300, True),
            (1500, True),
            (1699, True),
            (1700, True),
            (1701, True),
            (1900, True),
            (1999, True),
            (2000, False),
            (2050, False),
            (2500, False)])
MessageDirector: Implement ranges with interval_map.
Now handles CONTROL_REMOVE_RANGE. Still stalls on test suite.
MessageDirector: Moved participant specific info out of director and into MDParticipantInterface.
MessageDirector: Fix loop.
MessageDirector: Correctly prepare the set of subscribers.
MessageDirector: Fix for test_single, test_multi
MessageDirector: Handle remove upstream routing correctly.
MessageDirector: Fix upstream flow of single-channel add messages.
MessageDirector: Remove unused code.
MessageDirector: Initialize m_range_susbcriptions with an empty set.
Check that iterators from range.find(k) are not range.end().
MessageDirector: Fix inaccurate checking.
Re-arrange so both should_add_upstream and should_remove_upstream are called AFTER internal processing.
MessageDirector: Add clarity by defining a channel_t type.
MessageDirector: Rearrange upstream control messages to allow for corrected, more complex logic.
TODO: Repeat the should_add_upstream -> subscribe_upstream conversion for should_remove_upstream
TODO: Satsify unit tests.
MessageDirector: Clean-up range logic.
This commit only fails the range unit test.
This is expected: the upstream logic on remove_range needs to be rewritten (find #TASK in the file).
MessageDirector: Split upstream unsubscribes when appropriate.
MessageDirector: Stop duplicate channel deletion. Remove extraneous encode/decode.
MessageDirector: Reapply Datagram(Control) construction after rebase.