Add expiration support for message_verifier and message_encryptor

The patch will bake the expiration into message_verifier's signed message and message_encryptor's encrypted message to prevent the expiration from being forged. It will check the expiration every time you try to verify a signed message or decrypt an encrypted message. If the message is expired, it will raise an exception ExpiredMessage.
```ruby
encrypted_message = encryptor.encrypt_and_sign( data, 1.hour.from_now)
encryptor.decrypt_and_verify(encrypted_message) #=> data if not expired
encryptor.decrypt_and_verify(encrypted_message) #> raise ExpiredMessage if expired
```
cc @rafaelfranca @chancancode
@kaspth, the big concern is that since we accept user-provided serializer, some serializer may can't round-trip serialize Time object, For example, JSON
```
x = JSON.dump(Time.now)
JSON.load(x) #=> String

y = Marshal.dump(Time.now)
Marshal.load(y) #=> Time
```