[refactor] make blocks optional for Task::initialize

Simplified the .singularity.rb :D
[refactor] task description now a method in the Task class
[docs] rubocop - because there's some black magicks about
[feature][refactor] initial implementation of Runstate

Ended up refactoring .singularity.rb environment setup logic into SingularityDsl::Application,
which has its own Runstate object that is updated per-task run.
The idea is that the script describes how the runtime env should be set up. All of those
dependencies need to be injected *somewhere* though, hence SingularityDsl::Application.

The reason why it's a Singleton is because:

1. when .singularity.rb script is loaded the tasks should not be executed. They need to be
   injected *somewhere* though. Having a singleton allows for this - SingularityDsl.load_tasks
   does not need an instance of the application to store the tasks in for later execution.
2. removes the need of throwing other things into the primary Module, other than functions that
   could allow further configuration of the ApplicationA.
3. Application needs to exist during an entire .singularity.rb run.

Also threw in some logic to check on the status of tasks, how to aggregate their results,
how to handle fast-fail scenarios.
[refactor] create Singularity::Errors module
Merge pull request #4 from behance/task-runstate

Runtime state(s)!