thorium: store a time value for each destination buffer in exporter worker

Multiplexing (message batching) is done in worker space. A time value is
used to calculate the elapsed time, which is compared to a timeout value.

If the number of nodes is lower than the number of workers per node,
then each worker typically is responsible for at most one
destination node (it is an exporter worker). In that case, one single
time value for all buffers is sufficient (there is at most one buffer).

In the case where the number of nodes is greater than the number of workers
per node, each worker will be the exporter worker for at least one
destination node. In the case where the exporter is responsible for at
least two destination nodes, the time value is shared between the destination
buffers and thus the flushing operations are always synchronized. This prevents
buffers from filling up, and therefore decreases the multiplexing rate.

This changesett allows each buffer to be flushed independently, using one timer
per non-empty destination buffer for each exporter worker.

Link: https://github.com/GeneAssembly/biosal/issues/751
Signed-off-by: Sébastien Boisvert <boisvert@anl.gov>