TODO (Synapses)
---------------
* Check that delays do not exceed maximum delay in SynapticDelayVariable
* S.w[P,Q]='...' : shift origin of i,j
* S[:,:]='i<j' : int
* S[:,:]=array or sequence (boolean or int)
* S.w[:,:]='...' : might be problems when there are multiple synapses per pair

* Code generation
* SynapticVariable: should be usable as a numpy array
* MultipleSynapticDelay: a simple container that has the proper setattr
* Synapses.generate_code: check if postsynaptic variables are modified
* SpikeQueue callback (to Synapses): this way the clock is only for state updates
* Bound checks in setitem/getitem
* include static variables in pre/post code
* S.connect_random: fixed number of presynaptic neurons
* StateMonitor (already works with synapse indexes):
	what is needed is handling more general indexes in SynapticVariable
	(e.g. lists of tuples)
* Factor things
* Replace NeuronGroup.__init__ with own stuff?

* Heterosynaptic changes (Kempter et al. PNAS 2001)
* Neuromodulation (example?)
* Check what happens when i, j, lastupdate are in user's namespace
* Check units when setting S.w[i,j] ?