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
Removed _in_stack function

Just mushed it into _check_shapes. It can be extracted
later if need be, but it's not necessarily generally useful.

Also renamed check_in_init to skip_init_check which is more
indicative of what that argument should do.
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 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)