Numerous fixes to the serializer

We made the test suite serialize/deserialize/reserialize every workflow pattern that PatternTest uses:

1. Every workflow *spec* tested by PatternTest is serialized, deserialized and reserialized. The serializations are compared, and a workflow is initialised from the deserialized spec and run and the path/data are checked.
1. A workflow is initialised from each of the specs. Before the workflow is run, it is serialized, deserialized and reserialized. The serializations are compared, and the deserialized workflow is run and the path/data are checked.
1. A workflow is initalised from each of the specs. The workflow is run to completion, and then serialized, deserialized and reserialized. The seriaisations are compared.

This revealed a number of bugs, which we fixed. Now the JSON and Dictionary Serializers can successfully:

 * Serialize and deserialize every spec tested by PatternTest. Attempting to use a SubWorkflow spec will cause a warning to be issued about the dependency on an external XML file.
 * Serialize and deserialize workflows initialised from each of those specs, *except* SubWorkflows. Attempting to serialize one will cause a `storage.exceptions.TaskNotSupportedError` to be raised. (In theory this could be fixed,  but while we do need serialization in general we don't need that, so we probably won't get around to fixing it any time soon.)