enum_: move most functionality to a non-template implementation

This commit addresses an inefficiency in how enums are created in
pybind11. Most of the enum_<> implementation is completely generic --
however, being a template class, it ended up instantiating vast amounts
of essentially identical code in larger projects with many enums.

This commit introduces a generic non-templated helper class that is
compatible with any kind of enumeration. enum_ then becomes a thin
wrapper around this new class.

The new enum_<> API is designed to be 100% compatible with the old one.
diff --git a/tests/test_enum.py b/tests/test_enum.py
index a031d95..b1a5089 100644
--- a/tests/test_enum.py
+++ b/tests/test_enum.py
@@ -153,4 +153,4 @@
 def test_duplicate_enum_name():
     with pytest.raises(ValueError) as excinfo:
         m.register_bad_enum()
-    assert str(excinfo.value) == "Enum error - element with name: ONE already exists"
+    assert str(excinfo.value) == 'SimpleEnum: element "ONE" already exists!'
diff --git a/tests/test_pickling.py b/tests/test_pickling.py
index 707d347..5ae05aa 100644
--- a/tests/test_pickling.py
+++ b/tests/test_pickling.py
@@ -34,3 +34,9 @@
     assert p2.value == p.value
     assert p2.extra == p.extra
     assert p2.dynamic == p.dynamic
+
+
+def test_enum_pickle():
+    from pybind11_tests import enums as e
+    data = pickle.dumps(e.EOne, 2)
+    assert e.EOne == pickle.loads(data)