Currently, the BalancerPolicy::balance call, which is used by the sharding balancer returns a single migration per collection. In order to better utilize the ability to move multiple chunks in parallel across the cluster, this call should be made to return more than one migration per collection if this is appropriate.
For example:
Starting state of S1 (50 chunks), S2 (50 chunks), S3 (0 chunks), S4 (0 chunks) should result in two migrations: S1 -> S3 and S2 -> S4
Care should be taken that the balancer does not move chunks over-zealously and cause unnecessary churn in the cluster.