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.
@charleso I'm in the process of removing this from `SnapshotMeta`, and when cleaning up the corresponding code in the spec for `SnapshotMeta`, I found these:

``` Scala
  def beUpToDate(repository: Repository, date1: Date): Matcher[Option[SnapshotMeta]] = {   snapshot: Option[SnapshotMeta] =>
    snapshot must beSome { meta: SnapshotMeta =>

      "the snapshot feature store is the latest feature store if it is up to date" ==> {
        Metadata.latestFeatureStoreOrFail(repository) map { store => meta.featureStoreId ==== store.id } must beOk
      }

      "there are no new facts after the snapshot date" ==> {
        val newFacts =
          for {
            store      <- Metadata.latestFeatureStoreOrFail(repository)
            partitions <- FeatureStoreGlob.strictlyAfterAndBefore(repository, store, meta.date, date1).map(_.partitions)
          } yield partitions

        newFacts must beOkLike(_ must beEmpty)
      }
    } or { snapshot must beNone }
  }

  def beOkResult[R : AsResult]: Matcher[ResultTIO[R]] = (resultTIO: ResultTIO[R]) =>
    resultTIO must beOkLike { r =>
      val result = AsResult(r)
      result.isSuccess aka result.message must beTrue
    }
```

The first doesnt look very useful for much else, but I was wondering if at least the second one was worth putting somewhere common.  I'm not entirely sure i see any value in it