[WIP] GCM support

Rebased and rewritten. I'm not happy with this API so let's discuss how to make it better! Here's what encryption/decryption looks like with the current model:

```python
import binascii
key = binascii.unhexlify(b"0" * 32)
iv = binascii.unhexlify(b"0" * 24)
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
cipher = Cipher(algorithms.AES(key), modes.GCM(iv))
encryptor = cipher.encryptor()
encryptor.add_data(b"authenticated but encrypted payload")
ct = encryptor.update(b"a secret message") + encryptor.finalize()
tag = encryptor.tag
cipher = Cipher(algorithms.AES(key), modes.GCM(iv, tag))
decryptor = cipher.decryptor()
decryptor.add_data(b"authenticated but encrypted payload")
decryptor.update(ct) + decryptor.finalize()
```

When calling ```encryptor()``` or ```decryptor()``` you will get an ```AEADCipherContext``` object that has the methods from ```CipherContext``` but also adds ```add_data``` and ```tag```.

Note that you must obtain the tag from the AEADCipherContext object and build a new GCM object (this time passing the tag) if you want to do an encrypt/decrypt cycle.