experimental data family for keys

@snoyberg take a look at this if you get a chance. The main change is in PersistEntity.hs

``` haskell
data Key record
persistValueToPersistKey :: PersistValue -> Key record
persistKeyToPersistValue :: Key record -> PersistValue
```

Now I need to change TH.hs to generate something like:

``` haskell
instance PersistEntity User where
      data Key User = UserKey Int64
type UserKey = Key User
```

I think there should be a way to make this maintain the backend flexibility we want.