Tasks API refactor

This diff refactors a bunch of the task registration, initialization, and
custom accessor logic into a new class, `Tasks`, an instance of which is
accessible on the service instance, via the `tasks` attribute.

This makes accessing required tasks more natural.  Instead of:

  self.service.requireTask(FooTask)

You can now also do (preferred):

  self.service.tasks.FooTask

Or:

  self.service.tasks.require(FooTask)

Fixes #72