combine event-driven with threaded approaches

there are three main threads:
1. servers (UDP or TCP) i.e. accepting incoming data
2. clients (TCP) i.e. sending data to final points
3. background

each thread runs its own event loop

interaction between threads looks like this:

severs                     clients
thread1                    thread2
-----\                     /-----
-------> lock-less queue -> -----
-----/                     \-----

thread3 (background) cleans up queue

interaction with queue:
* each server enqueues single item per packet
* each client holds a pointer to an element in the queue
* each clients move only forward, never backwards
* queue purging is done by background thread

------------------------------------------>
         ^  ^           ^             ^
   client1  client2   client3      client4