Allow you to use '-' as a dst vlan.

It felt natural to me to specify {10: '-'}, rather than {10: null},
probably because it matches the syntax of the src vlan.
Either is acceptable now, because setting the vlan to null is handled
in the packet.
Convert switch to hub.

It sends in all directions, so it really isn't a switch.
Implement joining between devices.

Connect is akin to plugging in a wire between two ports.
Join is akin to a wire, where everything in one end comes
out the other.
Imeplement native vlans.

Anything received without a vlan is tagged, and sent with the native
vlan is removed.
Knowing the number of devices could be useful.
Add a new constructor.

Calling ChangeVlan with two arguments now assumes that the first is
the src vlans, and the second is the dst.
Add a new wire device, which you can make to join devices.