make cache export refuse to pave .gitgnored files

Summary:
Similar to D12, which fixed a .gitignore bug in import_tree(), we also have a
bug in export_tree(). This time the bug has to do with our dirty file
detection. Normally we fail an export if it would overwrite dirty files, but it
turns out `git checkout` will merrily pave over files that it thinks are
.gitignored.

The solution is to use `git reset --keep`, which apparently doesn't respect
.gitignore. That in turn runs into a tricky issue with timestamps in the index
file. See the big, sorrowful comments in `export_tree`.

https://github.com/oconnor663/peru/issues/15

Test Plan: Extend an existing unit test to include this case.

Reviewers: sean

Differential Revision: https://phabricator.buildinspace.com/D13