Major rework
Instead of a single completion handler there are now multiple blocks used when interesting events during the lifetime of a task occur (onState, onProgress, onResult, onError, and onFinish)
Hasn't been tested yet so may be broken
Still trying to figure out the best way to deal with sub-tasks and aggregate their events