Add `AnalysisTask`.

`AnalysisTask` allows a task to specify result files that need to be
copied to the worker node before it begins analysis. The framework will
automatically deploy and clean up these files.

Resource deployment is done synchronously by the management node in case
multiple tasks are launched that require large data files. Cleanup is
performed on the worker node after the task has executed.
Normalize line endings.
Fix bug when selecting worker node for a task.

When selecting a worker for a task, there was no check in place to
ensure that the worker had enough open slots to perform the task. For
example, a worker with 1 open slot could be assigned a task that
requires 2 slots.

This commit addresses this issue and cleans up the readability of the
code.