add more timing info to doExchanges
These update functions really scare me, because the attributes they update
are just assumed to be correct when used, rather than calculated on the fly.
This also has its problems (see notes in doExchanges()), but can be more
neatly accounted for. _update_running_no() is now deleted in favor of some
__getattribute__() calls. I'm not really sure that is a good idea either, but
the update AND return functionality being bundled together is almost certainly
better.
cover the edge case when fewer replicas than processors are available to
exchange. This only scales when this process is slow (slow here is arbitrarily
assumed to be whenever nreplicas_waiting_to_exchange > 2*cpu_count()).