Split depth changes into separate classes

This ensures only one type fo depth change can take place in a single
link - either splay(+), collect(-), or wrap(~).

This should support better type inference for outputs, as it allows us
to identify the outputDepth of each task. But this is not implemented yet.