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).


wondering whether validity should be its own message, for composability with other messages later on?. something like:

```proto
message RecordValidity {
  enum ValidityType {
    // setting an EOL says "this record is valid until..."
    EOL = 0;
  }
  optional ValidityType validityType = 1;
  optional bytes validity = 2;  
}

message IpnsEntry {
  required bytes value = 1;
  required bytes signature = 2;
  required bytes validity = 3;   
}
```

Too much marshaling...  too little self-description... `capnp` would help with this.