Currently, the clean up after a chunk migration waits for all cursors to be done before wiping out data.
Here's a triggering sequence of events:
shard0: has open cursor on chunk [low1.. high1]
shard0: moves chunk [low1..high1] to shard1
shard0: clean up after chunk moved delayed by open cursor
...
shard1: move chunk [low2..high2] to shard0, where [low2..high2] intercepts [low1..high1]
shard0: close cursor on chunk [low1..high1] while [low2...high2] is migrating
shard0: cleaning thread for [low1..high1] might touch [low2..high2]
An example situation is show in auto2.js logging attached (although the last step didn't happen there)