RFC: 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
If a reader can ever go out of scope while an iterator is still in scope, then I think we do need the shared_ptr + custom deleter here.