"NetworkNode" Nodes with named inputs

This PR improves API-level support for  Nodes with multiple semantically different inputs. It lets you do e.g.:

```python
    def test_named_inputs(self):
        def hello(t, y, z):
            if y > 0:
               print('%.3f: %s' % (t, z))
            return 0
 
        m = nengo.Model("foo", seed=0)
        with m:
            a = nengo.Node(np.sin)  # -- still works as usual
            b = nengo.Node(output=hello,
                           named_inputs={
                               'y': nengo.Vector(dimensions=1, descr="basically a docstring"),
                               'z': nengo.Vector(dimensions=1, descr="another docstring"),
                           }
                          )
            nengo.Connection(a, b.y, filter=None)
            nengo.Connection(a, b.z, filter=None)
 ```

I was thinking that for complicated nodes e.g. ones that manage sockets and IO, this could help make model definition code more readable.