Refactor output_collect for reuse.

Reduces cyclomatic complexity slightly as well.
Refactor small helper out of get_work_dir_outputs.

Leave comment about not understanding the complexity :).
Add helper for waiting on a job instead of a history.

Used downstream - should try to use this more in API tests.
Rename variable for clarity post output collections.

After tools can explicitly create collections the term created_collections becomes ambigious - these are history collection instances (HDCA) implicitly created by mapping over collections so renaming this field implicit_collections.
Rename variable for clarity.

This method does not just return datasets.
Script to build workflows from simpler YAML description.
Enable explicit tool creation of collections with static or determiniable number of datasets.

By "static" I mean tools such as a FASTQ de-interlacer that would produce a "paired" collection with two datasets everytime. By "determinable" I mean tools that perform N->N operations within the same job - such as a tool that needs to normalize a bunch of datasets all at once and not in separate jobs. (For N->N collection operations that should or can be done in N separate jobs tool authors should just write tools that operate over a dataset and produce a dataset and let the end-user 'map over' that operation.)

There are still large classes of operations where the structure of the output collection cannot be pre-determined - such as splitting files (e.g. bam files by read group) - that are not implemented in this commit.

Model:

The models have been updated to do a more thorough job of tracking collection outputs. Jobs just producing HistoryDatasetCollectionAssociations works fine for simple jobs producing collections - but you don't want to map a list over a tool that produces a pair and produce a bunch of pairs HDCAs and a list:pair HDCA- you just want a bunch of pieces and the one list:pair at that the top.

Workflow:

Workflows containing such operations can be executed - but the workflow editor has not been updated to handle this complexity (and it will require a significant overhaul) so such tools are not available in the workflow editor.

Tool Testing (WIP):

TODO:

Tests:

Includes two tools to test this - one that uses explicit pair output names and one that iterates over the structure of input list to produce an output list.

Includes several new tools API tests that test the tools described above via the API and implicit mapping over such tools. Includes two new workflow API tests - one that verifies a simple workflow with output collections works and one that verifies mapping over workflow steps in collections works.
Allow tools to dynamically discovered output collections.

Models:

Track whether dataset collections have been populated yet.

Dataset collections are still effectively immutable once populated - but dynamic output collections require them to be sort of likely `final` fields in Java (analogy courtesy of JJ) - allowing them to be declared before they are initialized or populated. This is tracked by the `populated` field.

Tools:

Output collections can now describe `discover_datasets` elements just like datasets - except in this case instead of dynamically populating new datasets in the history - they will comprise the collection. `designation` has been reused to serve as the element_identifier for the collection element corresponding to the dataset.

See Pull Request 356 for more information on the discover_datasets tag https://bitbucket.org/galaxy/galaxy-central/pull-request/356/enhancements-for-runtime-discovered.

Workflows:

TODO: Workflow evaluation should stop once an input is a collection instance with any sub-collection having a `populated` field set to False. This has not been done yet.
Refactor dataset collection creation to allow creating elements after initial construction.

Enables output collections of dynamically discovered datasets.
Prevent tools producing collections from showing in workflow editor.

Certainly feasible someday but workflow editor logic will require significant overhaul.
Update workflow execution and recovery for dynamic output collections.

Galaxy workflow data flow before collections

* - * - * - * - * - *

Galaxy worfklow data flow after collections (iteration 1)

* - * - * \
           * - * - *
* - * - * /         \
                     * - * - *
* - * - * \         /
           * - * - *
* - * - * /

Galaxy worfklow data flow after this commit

              / * - * \
         * - *         * - *
        /     \ * - * /     \
       /                     \
      /                       \
     /        / * - * \        \
* - * -- * - *         * - * -- * - *
     \        \ * - * /        /
      \                       /
       \                     /
        \     / * - * \     /
         * - *         * - *
              \ * - * /
Rearrange verify method to make duplication more obvious.
Remove duplication related to verifying a single dataset in tests.
Refactor out waiting for jobs - seems wrong place to put that logic this should allow easier moving.
Implement testing of output collections and elements.
Revise state handling to handle errors while populating state.
Rebase into output_collect refactor.
Improve structure of output_collect stuff.
More work on collections.