layers: Add UniqueObjects layer to wrap objects in unique ptr

This layer should sit at the BOTTOM of the layer stack (closest to the driver, furthest from the app). It interecpts all created non-dispatchable-objects and wraps them in a struct, returning that struct ptr up the chain.

For all API calls that use NDOs, this layer will unwrap them, and overwrite the wrapped handle with the actual handle before passing it down. Then, after calling down to the driver, the layer will re-overwrite the NDO handles with the original, wrapped handle.

When an NDO object is destroyed, the actual handle is passed down, then the wrap struct object is destroyed.
7 files changed