Handle symlinks in versioning

This adds some integration tests, running the same thing with the various versioning settings.

Then modifies the versioners to handle symlinks. The first check is easy, the Stat() would fail on broken symlinks and needs to be an Lstat(). The other stuff is to make the staggered versioner a bit more generic, since it assumed that only files and directories exist which is not the truth. You might want to look at that diff with `git diff -w` since there's a big indentation change...