Move the addition of compiler options to the code comments (commit 6102144) out of the `run` method

This slowed simulations with weave down considerably, since the string formatting was done at every time step even though changes to the options were only taken into account at `CodeObject` initialisation.
Use `is not None` instead of `hasattr` to check for before/after Python code in weave

`hasattr` is relatively slow, checking with `is not None` is considerably faster.
Use a set of clocks, not a list in `Network.run`

This makes finding the next clock much faster for several objects that might all share a clock (e.g. the `defaultclock`). Some other micro-optimisations for clocks.
Merge pull request #369 from brian-team/runtime_optimisations

Runtime optimisations