Ipns Consistency

This PR changes the DHT so that it stores records instead of simple values. This allows us to add a layer of security onto the DHT, and also allows us to validate values that are stored in it.

Currently, only two value types are allows to be stored in the DHT:

- Public Keys
    - Public keys are verified by checking their hash against the key.
    - [relevant code](https://github.com/jbenet/go-ipfs/blob/consistency/routing/dht/records.go#L99)
- Ipns Records
    - Ipns records are verified by unmarshalling them, checking their validity type, and then performing the proper validity checks from there
    - [relevant code](https://github.com/jbenet/go-ipfs/blob/consistency/namesys/publisher.go#L110)

Other types of Ipns Validity functions should be discussed, as only one is implemented. More complex checks may require a change in how the validity functions are called (maybe add new parameters, etc).


Also, this is just concatenating the values? not signing the marshalled proto? (i guess that's fine. would be nice to have a standard object for checking signatures. something like:

```Go
var sigv ic.SignatureVerifier
sigv.Write(e.Value)
sigv.Write(e.Validity)
sigv.Write(...)
if err := sigv.Verify(e.sig); err != nil {
   // ruh roh.
}
```