SyncedVariantReader/Iterator

Also some variant_reader_test cleanup
what I meant is that the iterators should hold a vector of shared_ptrs to the headers. Then, every read you create, gets a shared pointer to that shared pointer (literally just a reference count increment), thus you only create each header once.

You can save this for your next commit since a lot of no-copy-like optimizations will take place anyway.