lib: return a structured log in `State.step`
lib: add function `State.what_happened_to_string`
test: use `State.step`'s happening logs
test: add 2 targets depending on each other

This tests 3 cases, for target1 depending on target2:

- both may succeed consecutively
- target 1 may fail and make target2 fail because of dependency
- target 1 may succeed and target2 fail by itself
lib: improve precision of phantom type in `Path`
lib,test: remove notion of `Data.pointer`
lib: handle “directory-only” file-structures

This means that now we are not like Git which knows only about files.
test: add a failure case for non-built directory
test: improve infrastructure, run tests optionally