accept dependencies as an after array or as an object with before and after arrays (and other user-land properties)
use EventEmitter2
dependencies can now be an object specifying before and after, and other state to pass to task: {before:[], after:[]}
Don't emit start, error, and end events, just return err in the callback (or throw it)