Made Builder pluggable, can now validate / optimize

Building on the builder refactoring by @arvoelke, the builder can now be modified at runtime. This means that modellers can create their own neuron types or NengoObjects or learning rules, etc., and inject them into the reference simulator. Granted, this requires some pretty advanced knowledge of the entire codebase, but it's important that something like this is at least possible.

See the new `rectified_linear.ipynb` example to see how this stuff is useful from a user perspective. I'm not 100% sure that I've done that example correctly, as for many seeds even the 2D representation example gives hilarious results; could, however, be fixed by using a different decoder solver, perhaps?

From a backend perspective, the builder has been changed quite a bit; see the commit messages for more details. It's obviously far from perfect, but I think the ability to modify it at runtime is important. It's also now possible to plug in validators and optimizers; currently, it only does some basic validation, but making new validators should now be much more straightforward.