Specialized Exceptions

Fix for issue #2

Adds a base Exception to be thrown during during decoding/decryption: the DecodeException. Any exception thrown during decoding/decryption can be caught by catching that type. With the exception of the lack of OpenSSL error, that will now throw the more appropriate RuntimeException and is a completely separate type of Exception.

There's also 2 specialized Exceptions: one for expiration and one for failing to verify the header.