Add a utility function to replace constants in sympy expressions.
Provide the full namespace information to state updaters.
Do not try to replace constants in the linear state updater for now.
With the slightly changed semantics of group-specific and run namespaces, not setting a group-specific namespace should be identical to setting an empty one.
Refactor the function mechanism a bit (codegen.functions is gone) -- biggest change is that the registration of function implementations now doesn't care about available codegen targets (which led to many problems due to them not being available yet), it just stores the implementation with whatever key was given (i.e. a string, a `CodeGenerator` or a `CodeObject` class) -- handling the various fallbacks is only done in `__getitem__`.
Allow functions to have "dynamic implementations", code that is generated during `Network.before_run` and has access to the `Group`.
Make use of dynamic function implementations for `TimedArray` in order to do upsampling based on the group's dt.
Add `Function.is_locally_constant` and query it in the linear state updater to allow locally constant functions of time (at the moment this means: `TimedArray` objects with an appropriate dt) in the "+b" part of "M*X + b".
Treat "locally constant" functions of t as constant over one timestep, i.e. allow them to make use of exact integration. This currently only applies to the use of `TimedArray` with an appropriate dt. Closes #210
If the user did not chose a specific integration method, the best integration method might not be known until runtime (functions are not necessarily known at creation time).