Remove raw pointers from Variant Readers and Iterators

Partial completion of #195

Additional cleanup/testing of move/copy constructors/assignment in Variant Readers and Iterators

TODO for 195:
- similar work on Sam and other classes
- change shared_ptr to unique_ptr
we will have to decide whether we want the iterator to have co-ownership on these 2 pointers with the reader. Up to now we've been delegating the ownership to the reader, not the iterator. In that case, the iterator can see this as a naked pointer and not delete it in the desrtuctor safely, and the reader can have a unique_ptr. If we want co-ownership, it will have to be a shared ptr.