Definitely want to avoid this sort of kludge at this stage! It also dovetails with something I noticed when looking at `__call__` -- there needs to be a way to call a task "purely" w/o caring about its pre/post hooks.

Offhand I think what might work is this:

* `__call__` simply stands in for `self.body`; it is the interface for calling a task as if it was the original function, with little/no magic. This helps preserve what I'd consider "non-surprising" behavior, and implements the abovementioned ability to skip running post/pre.
* Some new method on Task (or, possibly, on `Collection`, *or* maybe a global function -- though I want to shy away from those) is the "powerhouse" which executes a task within the context of a collection & honors pre/post hooks (which require that context).
    * It would probably also be the API for additional "meta-task" things such as parallel execution / execution across a series of differing args (which would be relied on by Fab 2) though that can come laterish.
    * Namestorm: `execute` (as now & in Fab 1), `run` (conflicts with the command runner), `call` (easily confused with the dunder version), `invoke` (eh)`, ???. I think `execute` wins hands down really.
* The default CLI runner uses this new method instead of `__call__` obviously.