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 
Something along these lines

```scala
j match {
  case JsObject(pairs) => JsSuccess(TrailMetaData(pairs.toMap))
  case _ => JsError("NOOOO")
}
```

might be a bit better, as it at doesn't accept the wrong type in the field. But it's not a big deal.