Handle symlinks in versioning (fixes #1071)

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...
Hmm, wonder what the right thing to do here is. On unix, we version the symlinks, which is kinda pointless but provides some sort of history of what it used to point to... Does this make sense in Windows? What does a symlink even look like, can I see what it points to? Or does it make more sense to just remove instead of archive symlinks?