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.