Binding this to URL space
When parallel() gets stopped, it should try to interrupt its bodies.

And a corresponding test to check that all branches are getting killed.
Beefing up assertions in the test
Beefing up the cancel() method to pass the context.

Also renaming FlowExecution.finish() to FlowExecution.cancel() for uniformity.
StepExecution.stop() now also gets a contextual Throwable object, which I think
is useful as those implementations tend to interact with external systems
(such as another job triggered from this workflow), and this contextual information
can be passed onto them to record why/how the cancellation has happened.
The current latest is 1.4.9

I believe JBoss does semantic versioning, so this upgrade should be safe.
Making this class serializable.

In 1.591 I made a chance to make CauseOfInterruption seializable as a
whole.
Making FlowNode Saveable based on a feedback from Tom
Fixed ConcurrentModificationException problem.

Inconsistent lock results in sporadic exceptions like the following:

ERROR: failed to start build
&amp#27;[8mha:AAAAWB+LCAAAAAAAAP9b85aBtbiIQSmjNKU4P08vOT+vOD8nVc8DzHWtSE4tKMnMz/PLL0ldFVf2c+b/lb5MDAwVRQxSaBqcITRIIQMEMIIUFgAAckCEiWAAAAA=&amp#27;[0mjava.lang.RuntimeException: Failed to serialize org.jenkinsci.plugins.workflow.job.WorkflowRun#execution for class org.jenkinsci.plugins.workflow.job.WorkflowRun
	at hudson.util.RobustReflectionConverter$2.writeField(RobustReflectionConverter.java:214)
	at hudson.util.RobustReflectionConverter$2.visit(RobustReflectionConverter.java:182)
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:138)
	at hudson.util.RobustReflectionConverter.doMarshal(RobustReflectionConverter.java:167)
	at hudson.util.RobustReflectionConverter.marshal(RobustReflectionConverter.java:108)
	at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:43)
	at com.thoughtworks.xstream.core.TreeMarshaller.start(TreeMarshaller.java:82)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.marshal(AbstractTreeMarshallingStrategy.java:37)
	at com.thoughtworks.xstream.XStream.marshal(XStream.java:1026)
	at com.thoughtworks.xstream.XStream.marshal(XStream.java:1015)
	at com.thoughtworks.xstream.XStream.toXML(XStream.java:988)
	at hudson.XmlFile.write(XmlFile.java:178)
	at hudson.model.Run.save(Run.java:1915)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.copyLogs(WorkflowRun.java:284)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.waitForCompletion(WorkflowRun.java:227)
	at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:188)
	at hudson.model.ResourceController.execute(ResourceController.java:89)
	at hudson.model.Executor.run(Executor.java:240)
	at hudson.model.OneOffExecutor.run(OneOffExecutor.java:43)
Caused by: java.util.ConcurrentModificationException
	at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:1115)
	at java.util.TreeMap$ValueIterator.next(TreeMap.java:1160)
	at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution$ConverterImpl.marshal(CpsFlowExecution.java:714)
	at hudson.util.XStream2$AssociatedConverterImpl.marshal(XStream2.java:358)
	at com.thoughtworks.xstream.core.AbstractReferenceMarshaller.convert(AbstractReferenceMarshaller.java:69)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:58)
	at com.thoughtworks.xstream.core.AbstractReferenceMarshaller$1.convertAnother(AbstractReferenceMarshaller.java:84)
	at hudson.util.RobustReflectionConverter.marshallField(RobustReflectionConverter.java:223)
	at hudson.util.RobustReflectionConverter$2.writeField(RobustReflectionConverter.java:210)
	... 20 more

	at org.jenkinsci.plugins.workflow.SingleJobTestBase.assertBuildCompletedSuccessfully(SingleJobTestBase.java:135)
	at org.jenkinsci.plugins.workflow.SingleJobTestBase.assertBuildCompletedSuccessfully(SingleJobTestBase.java:131)
	at org.jenkinsci.plugins.workflow.steps.parallel.ParallelStepTest$6.evaluate(ParallelStepTest.java:187)
	at org.jvnet.hudson.test.RestartableJenkinsRule$3.evaluate(RestartableJenkinsRule.java:84)
	at org.jvnet.hudson.test.JenkinsRule$2.evaluate(JenkinsRule.java:486)
	at org.jvnet.hudson.test.RestartableJenkinsRule.run(RestartableJenkinsRule.java:100)
	at org.jvnet.hudson.test.RestartableJenkinsRule.access$100(RestartableJenkinsRule.java:30)
	at org.jvnet.hudson.test.RestartableJenkinsRule$1.evaluate(RestartableJenkinsRule.java:64)
	at org.junit.rules.ExternalResource$1.evaluate(ExternalResource.java:48)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
	at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264)
	at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
	at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124)
	at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200)
	at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153)
	at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
Making findbugs happier