Merge Task into Node and simplify its interface

This PR simplifies the source code by merging the `Task` class into the `Node` class. This was done to provide a consistent interface and solve the ambiguity about what a `Task` vs `Node` actually represents.

Previously, unlike its name implied, the `Task` class represented a callable `Closure` (either before, during or after callback) with an optional description and its dependencies. Executing and merging those dependencies was always handled by the `Node` and as such some properties of `Task` were never used to begin with. The `Node` class was closest to what a user considers a "task", i.e. a unit that represents its closure(s), its dependencies, description, etc.

The resulting source code is slightly easier to work with and the foundation for the next couple of PRs.