I agree it's best to fail earlier at task definition time if the user gave any invalid `*args`. I think we should change `Task.get_prerequisites` into `Task.validate_prerequisites` and call it from `Task.__init__` -- this way when everything lines up a Task will have a simpler access to its prerequisite list (goes back to just being attribute access) and we'll still ensure everything in that list is valid.