Implement PunchHole for windows

It sets the file to be "sparse" on first met, but uses a
map[*os.File]struct{} for this - won't this disable GCing
those pointers?

I don't know how unique is the file.Fd() - or should we use
the file.Name() for this?

Or just forget this and provide a SetSparse function?
Fix missing unlock and use uintptr instead of *os.File
add punch_test
Merge pull request #7 from tgulacsi/master

Implement PunchHole for windows