Change MetaData types to wrap a Map

This wraps the types that carry the `MetaData` around a `Map[String, JsValue]`.

To avoid writing out the key that carries the data (`json`), we implement our own `Reads` and `Writes`.

@robertberry