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.
This could be confusing to the user since the error is coming from the wrapper library, and not Windows. Not sure I have a better suggestion though.