Remove raw pointers from Sam Readers/Iterators and Sam/Variant Writers

Additional work on #195

Waiting on #213 to add move construction/assignment tests
You are not avoiding anything. Passing by reference doesn't avoid the subsequent reference increment in the obligatory assignment. Passing by value makes the reference increment in the constructor call, but then `std::move` into the parameter. The net is again 1 reference increment. However, should you call this constructor with an r-value (e.g. `SamIterator(make_shared(...));`) you now only do 2 moves, instead of creating a temporary, incrementing the count, then decrementing the count when it's destroyed. 

Scott Meyers item 16 (as discussed in the book club), also applied here.