Basic support for task prerequisites

This allows a structure such as:

```python
@task
def test():
  pass

@task
def docs():
  pass

@task('test', 'docs')
def publish():
  # test and docs must succeed first
  pass
```