OutputQueue is now abstract, and the different queue methods
are subclasses.
This allows the same flexibility as before (subclasses can change
the type of items they add, implement their own throttling logic,
and say how the queue is ordered).
Organising it this way makes the package a lot easier to understand
as there's no longer a messy separation of concerns between
OutputQueue and QueueHandler (e.g. the output stream is no longer
in two places with two send methods, all of the definitions
relating to how the queue works are in one place, etc).
Instead of having lots of objects implement Comparable or Comparator,
pass the comparator in to the PriorityBlockingQueue.
This requires recreating the queue if the QueueHandler is ever changed,
but the previous behaviour resulted in an unstable/undefined ordering,
so it's probably better this way anyway.
This means that QueueItems no longer need to know about QueueHandler,
which makes me slightly happier.
OutputHandlers are now incharge of creating QueueItems and comparing them.
Parser now allows for replacing the OutputQueue entirely
Default OutputQueue allows replacing of the OutputHandler (by giving it a new QueueFactory that outputs the alternative QueueHandler)
Sending PING is now High Priority
QueueItems now sort by a unique itemNumber not time, as priority queue doesn't guarentee order for itesm of teh same priority created at the same time
Add a rate-limited OutputQueue