Use a separate thread to handle incoming messages.
Incoming messages were taken into account very late,
because of the following scheme:
...
* do something (compute, load-balance, ...)
...
* receive some message
* create a new asynchronous receive communication
Here, we cannot have received any new message, even
if the sender was ready a long time ago, since the
transfer only started when we created the new communication.
Thus, we start a new iteration.
The solution is to implement a separate thread to handle incoming
messages asynchronously. Those messages are put in a queue to be
consumed later.