Primitive specification

Okay, I'm making this into a full blown pull request, so that comments on the implementation etc. can be made inline.

As I see it, things that need doing before this is merged:

* [ ] Decide on whether or not to have Ciphertext (or whatever it ends up being named)
* [ ] Support swapping out of the PublicKey and PrivateKey mechanisms.
* [ ] What else?

This fixes #43