TODO:

    - consider adding the local endpoint name to PacketListener::PacketReceived() params

    - consider adding ListenerThread class to support old seperate thread listener functionality, something like:

        class UdpSocketListenerThread{
        public:
            UdpSocketListenerThread( UdpSocket& socket, Listener *listener );
            UdpSocketListenerThread( UdpSocketReceiveMultiplexer *mux );
            ~UdpSocketListenerThread();

            void Run();
            void Stop();
        };

    - work out a way to make the parsing classes totally safe. at a minimum this
    means adding functions to test for invalid float/doublevalues,
    making sure the iterators never pass the end of the message, ...
        (passing end of message can happen if:
            - too many args in type tags
                a. typetags overflow message size
                b. args fulfilling typetags overflow message size
            - strings too long or not terminated correctly
            - blobs too long or not terminated correctly

        if the message was fully checked during construction, the end() iterator
        could be moved back until only arguments which fit withing size() may
        be interated (this could be none). A flag could be set to indicate that
        something was wrong.

    - other packet badness could include:
        - time tags too far into the future (the scheduler should deal with
            that i guess).
        - message address patterns which aren't correctly terminated

    - improve the ability to parse messages without tags (SC uses methods which
            get the data and advance the iterator in one step.)
        - Check* could be modified to do this - ie if typetags are not present
            it could check that reading the field won't escape the message size
            and return the data, or return false if some consistency
            constraint is violated.
        (or alternately drop support for messages without type tags)
        

    - add a method to discard an inprogress message if it gets half
        constructed and the buffer is full in OutboundPacket

    - write a stress testing app which can send garbage packets to try to flush out other bugs in the parsing code.



