Snapshot metadata

This isnt for merging yet, just WIP,

Bit of a slow start, but figured while I am still finding my way around the codebase i'll raise this so ppl can peek at the progress more conveniently and give me feedback as i go.
Aside from writing tests I dont see any need to expose them, Charles was talking about changing the internal representation so its not a disjunction between a legacy type and new json type, hiding the internals like this makes changes like those easier,

aside from tests, the only way to create the metadata should be `createSnapshotMetadata` and `parse`