Insert message into the WriteQueue's map storing the messages
before writing it out in case the reader thread gets the
answer before WriteQueue::notifyResult is called.
Make locking more fine-grained, move handling of the
No-op message into the WriterThread (basically, do not
lock dataMutex over invocation of the no-op message
as this might queue messages). Introduce a reader thread
using select()/Windows overlapped I/O, removing the need
for timers.