Encapsulated MetaData members. Added helper functions for common tasks.

I'm just stubborn. I have no problems with inferred types in Go!, but it bothers me in C++ for some reason. Particularly raw pointers, and to a lesser extent smart_ptrs.

I've seen some code that should have been `const auto&`, and I felt like auto was confusing things. Maybe I should get in the habit of using `const auto&` more, it should work with return temporaries too.

If even Scott Meyers says auto should be used, then I should really start doing it I guess.