#976: advanced dependencies

This closes #976 by adding a complex dependency test and adding
the code to make it work.

The test contains statements like:
```
        [[[30T06+P8DT6H/P3W]]]
            graph = "foo[20T-P2W] => bar"
```

The parsing and processing of things like `20T-P2W` was already done in the
time_parser.py for recurrence statements, but can now be done via a
convenient `get_point_relative` call.

The major issue is that with statements like `foo[20T-P2W] => bar`, it is no
longer possible to figure out a cleanup cutoff or a future trigger offset that
is universally valid for all points on the sequence. This now has to be done
for each task instance in `taskdef.py`. For standard, simple offsets like
`[-PT6H]`, the behaviour is pretty much the same.

The new future trigger runahead treatment has the nice property of being
adaptive based on the current active tasks.

@hjoliver, please review.