Add Windows support
refactored path normalization into one place
created shared ensureDirectoryExists function
updated copyFile to be more symmetric/consistent with writeFile
pulled zip-extraction logic into its own helper method (and lifted up 1 scope)
Merge branch 'Marsup-windows-support'