Allow instances in STOPPING to be stopped

* Make it clear when we need to do things because we are entering or exiting
* Allow STOPPING to be stopped
* Properly do cleanup regardless of state
* Setup instances correctly
* Reap STOPPING instances since nothing else will
* Attempting to stop a STOPPED instance is a no-op

[#78231674]

Signed-off-by: Matthew Sykes <matthew.sykes@gmail.com>
Make stop idempotent

If we stop and we get an exception this often just indicates that a
previous stop succeeded. We test for this by listing handles. If the
handle we're trying to stop has already disappeared then what the client
asked for (stopping the container) has occured, so we return success.
This means the stop succeeds, the task state correctly goes to stop, and
we avoid zombie containers.

[#78231674]