So it looks like the OPTIONAL kind is not used for much of anything at the moment (I may be missing something) so it's probably safe to switch that over to a new POINTER kind and get rid of the `isPointer()` function. The `isUniquePtr` and `isSharedPtr` still have to remain in one form or another though.

As for the raw pointers, setting a value is done by copy at the moment (one of the things I could improve on) so you would simply be unable to set a `unique_ptr` without raw pointers support. You can look at tests for `unique_ptr` for some examples. Setting a raw pointer on the other hand, was mostly added because I might as well finish implementing the class. I know that the block infrastructure makes use of lots of raw pointers within a well defined ownership model so I wouldn't be surprised if it came in handy one day.