Ensure proper exception handling and reporting


Implement exception handling and rethrow with strongly-typed exceptions, deriving from common base class.

In short, exception which occur in the unmanaged SDK should be caught by our managed wrapper, and where there is no reasonable course of action to handle the exception, a new strongly typed exception from our library should be thrown containing both the underlying unmanaged exception details, as well as details about the operation being performing in the managed wrapper.

The library should implement custom strongly typed exceptions, that all derive from a common base class, thus allowing a end user in a .NET language to catch any exceptions thrown by the library independently from any other system-wide exceptions.