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?