Not going to try to hide the struct definitions from the public API

This would require an even bigger refactoring of the code and it's probably
not worth it. I think the sane thing to do is to only document the pieces of
the struct that we want people to use.
Not going to create accessors for the metadata