Fix Thread race issues and heap corruption in DisplayChannelHost.

Currently, we add deferred messages to a queue in main thread and
handle them in a IO thread. This lead to couple of issues:

1)We are adding to the queue a message in main thread, while
  handling the messages in IO thread.
2)We allocate memory for the queue in main thread(push), while
  we free it in IO thread(pop).

Now, we do so that we post a task to IO thread and all book keeping
happens in IO thread only.

This fixes #169