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.
You have to be careful because it is a pretty big trade off, without these constructors your can't really do stack safe recursion in scala, unless you also define a co-routine loop (something like this: https://github.com/argonaut-io/argonaut/blob/master/src/main/scala/argonaut/DecodeResult.scala#L11).

(also it isn't a public API if you were worried about having to change other programs if we change the representation - any change is internal to ivory)