Better error messages

This is a collection of rather small changes, improving the error messages a user receives (in particular when using Brian1-style reset and threshold definitions). There's one major bug fixed though: before 7331a8f, you could do this:
```Python
>>> G = NeuronGroup(10, 'v:1')
>>> G.v = np.arange(12)
>>> print G.v
<neurongroup.v: array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9.])>
>>> G.v = np.arange(3)
>>> print G.v
<neurongroup.v: array([ 0.,  1.,  2.,  0.,  1.,  2.,  0.,  1.,  2.,  0.])>
```
This is inherited from numpy, because we currently always index with an array:
```Python
>>> ar = np.zeros(10)
>>> ar[:] = np.arange(3)  # raises error as expected
...
ValueError: could not broadcast input array from shape (3) into shape (10)
>>> ar[np.arange(10)] = np.arange(3)  # works
>>> ar
array([ 0.,  1.,  2.,  0.,  1.,  2.,  0.,  1.,  2.,  0.])
``` 

We now raise an error if the size of the right-hand-side is not 1 or the size of the index array -- I think that's the right thing to do.

Everything is ready to merge from my side.