MMSBUILD-254 (Mark) Improve Win32 error handling

@markbenvenuto This pull request introduces a new error object `WindowsError` that encapsulates a Windows error code along with the name of the Win32 API function that failed.  The higher-level helper functions all now return a `WindowsError` instead of a raw error code or `HRESULT` in order to provide better diagnostic output and facilitate debugging if something goes wrong.
Discussed this orally and decided to leave it as is.  The only workable alternative we could come up with was to use an empty string, which we agreed would not be an improvement.