#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.


This loop worries me - it will typically start from suite initial cycle and iterate the sequence all the way to my_point plus offset, so for a very long running suite this will get slower and slower won't it?   I tested this by restarting a small suite with an irregular offset after editing the state file to make it look as if it had been running for years.  Is it possible to jump onto the sequence close  to my_point and go from there?