move abc, inline introspect method, use six for abcs

* abc moved to cryptography.primitive.interfaces
* six added to dependencies
* six used to have py2x/py3x compatible abc
* nonce abc removed for now
diff --git a/cryptography/bindings/openssl/api.py b/cryptography/bindings/openssl/api.py
index f95e4d6..917c184 100644
--- a/cryptography/bindings/openssl/api.py
+++ b/cryptography/bindings/openssl/api.py
@@ -13,7 +13,7 @@
 
 from __future__ import absolute_import, division, print_function
 
-from cryptography.primitives.abc.block import modes
+from cryptography.primitives import interfaces
 
 import cffi
 
@@ -74,12 +74,14 @@
         )
         evp_cipher = self._lib.EVP_get_cipherbyname(ciphername.encode("ascii"))
         assert evp_cipher != self._ffi.NULL
-        iv_nonce = self._introspect(mode)
+        if isinstance(mode, interfaces.ModeWithInitializationVector):
+            iv_nonce = mode.initialization_vector
+        else:
+            iv_nonce = self._ffi.NULL
 
         # TODO: Sometimes this needs to be a DecryptInit, when?
         res = self._lib.EVP_EncryptInit_ex(
-            ctx, evp_cipher, self._ffi.NULL, cipher.key,
-            iv_nonce
+            ctx, evp_cipher, self._ffi.NULL, cipher.key, iv_nonce
         )
         assert res != 0
 
@@ -88,14 +90,6 @@
         self._lib.EVP_CIPHER_CTX_set_padding(ctx, 0)
         return ctx
 
-    def _introspect(self, mode):
-        if isinstance(mode, modes.ModeWithInitializationVector):
-            return mode.initialization_vector
-        elif isinstance(mode, modes.ModeWithNonce):
-            return mode.nonce
-        else:
-            return self._ffi.NULL
-
     def update_encrypt_context(self, ctx, plaintext):
         buf = self._ffi.new("unsigned char[]", len(plaintext))
         outlen = self._ffi.new("int *")
diff --git a/cryptography/primitives/abc/__init__.py b/cryptography/primitives/abc/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/cryptography/primitives/abc/__init__.py
+++ /dev/null
diff --git a/cryptography/primitives/abc/block/__init__.py b/cryptography/primitives/abc/block/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/cryptography/primitives/abc/block/__init__.py
+++ /dev/null
diff --git a/cryptography/primitives/block/modes.py b/cryptography/primitives/block/modes.py
index 1e9b14b..c722e73 100644
--- a/cryptography/primitives/block/modes.py
+++ b/cryptography/primitives/block/modes.py
@@ -13,7 +13,7 @@
 
 from __future__ import absolute_import, division, print_function
 
-from cryptography.primitives.abc.block import modes
+from cryptography.primitives import interfaces
 
 
 class CBC(object):
@@ -28,4 +28,4 @@
     name = "ECB"
 
 
-modes.ModeWithInitializationVector.register(CBC)
+interfaces.ModeWithInitializationVector.register(CBC)
diff --git a/cryptography/primitives/abc/block/modes.py b/cryptography/primitives/interfaces.py
similarity index 75%
rename from cryptography/primitives/abc/block/modes.py
rename to cryptography/primitives/interfaces.py
index 609a2ae..a2b091d 100644
--- a/cryptography/primitives/abc/block/modes.py
+++ b/cryptography/primitives/interfaces.py
@@ -14,8 +14,8 @@
 from __future__ import absolute_import, division, print_function
 
 import abc
+import six
 
 
-ModeWithInitializationVector = abc.ABCMeta('ModeWithInitializationVector',
-                                           (object, ), {})
-ModeWithNonce = abc.ABCMeta('ModeWithNonce', (object, ), {})
+class ModeWithInitializationVector(six.with_metaclass(abc.ABCMeta)):
+    pass
diff --git a/setup.py b/setup.py
index 1044c97..cbbf100 100644
--- a/setup.py
+++ b/setup.py
@@ -21,9 +21,11 @@
 
 
 CFFI_DEPENDENCY = "cffi>=0.6"
+SIX_DEPENDENCY = "six>=1.4.1"
 
 install_requires = [
     CFFI_DEPENDENCY,
+    SIX_DEPENDENCY
 ]
 
 setup_requires = [
diff --git a/tox.ini b/tox.ini
index 4d17ebe..02d521b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -5,6 +5,7 @@
 deps =
     pytest-cov
     pretend
+    six
 commands = py.test --cov=cryptography/ --cov=tests/
 
 [testenv:docs]