Added documentation, updated setup.py, added custom metaclass.

* In order to better control the way that subclasses of Magma are created,
  I added a custom metaclass MagmaMeta which simplifies the way subclasses
  of Magma are created and ensures that the CAYLEY_TABLE data is viable
  before the user creates the subclass.

* I added two lines to the __init__() function of Magma to ensure that objects
  are not instantied from Magma, and can only be instantated from subclasses of
  Magma

* I added a lengthy docstring to the Magma class to help users better understand
  how to use the class.

Note: cayley_table, magma_set, and order have been replaced with CAYLEY_TABLE,
SET, and ORDER respectivley to emphasize their immutability as constants.