Used metaclass magic instead of magic functions

We've been using the special function ``make`` in networks,
and started using ``initialize`` in other objects recently.
This moves the things in those methods back into __init__
and instead makes sure that the right things happen by
controlling object creation through new metaclasses:
NetworkMember for NengoObjects and NengoObjectContainer
for Network.

Other changes:
- Added with_metaclass function to utils.compat,
  as Python 2 and 3 have different syntax for this.
- Added Network.add which encapsulates some of the logic
  that used to be NengoObject.__init__
- Made NengoObject.__str__ a bit safer and easier to read
Rearranged the classes in objects.py
Removed add_to_network methods

- The logic is now contained in Network.add.
- Added a new `objects` dictionary which essentially maps
  class -> list containing instances of that class.
  - This is to get around an if isinstance... chain.
Rearranged methods in Network
Added a with_self decorator in utils.network

This allows networks to explicitly mark methods that
should be executed in its own context.
See EnsembleArray.add_output for example usage.

Other changes:
- Added documentation to the Network class
- Added utils.decorators so we can make better decorators
  - Added tests (which serve as examples) to
    utils.tests.test_decorators
- Added test_network that ensures that the nengo objects
  created in EnsembleArray.__init__ and EnsembleArray.add_output
  are going to the correct place
- Slight modification to Network.__str__ (seeing "None" tricked
  me into thinking that the EnsembleArray was None, not just that
  the label was None)