Properly finish all unfinished operate business

- Really the leak was caused by us leaving weak_ptr's lock() open, and
  that was unfinished business of a coroutine.  There can be more of
  that.  We need to shut down the coroutines properly.  Introduce
  switch_right and call that after operate ends, so that we
  round-robin back to query, with everything wrapped up properly.
  That way we don't leak either.