Refactored existing code and added support for symmetric encryption.

I think most UUID libraries actually just use `/dev/urandom`, that's what Python does at least: https://hg.python.org/cpython/file/8b1ac1a3d007/Lib/uuid.py#l568

I like controlling nonce generation because it prevents people from using bad sources of random for their nonce.