If the body has completed synchronously, isLaunched() should return true
Prevent double launching
[JENKINS-25504] Async step should continue executing until all the bodies are done and the outcome is set.

Previously, as soon as an outcome is set the step was considered done, even when the body was running.
This corrupts the flow graph as multiple CpsThreads collide on trying to update the same FlowHead.
[JENKINS-25504]

If the step is marked as failed while the body is still running, try to interrupt the body execution.
This would speed up the step as a whole completing as a failure.
Making findbugs happy
Note to myself.

The test fails right now because CpsStepContext is @PersistIn(ANYWHERE), meaning in general there can be multiple copies of the same instance just because it's serialized multiple times to different places.

So it can't maintain state like #outcome, #startedBodies, and so on. Such stuff would have to be maintained elsewhere.
This is how to test the "block fails before body is done" situation.

Will rebase and remove this when this is all done.