Extend indexed assignment and binary operations to bounds, if present.

Currently, indexed assigment ignores bounds:

>>> f = cf.example_field(0)
>>> a = f.dimension_coordinate('X')
>>> a.array
array([ 22.5,  67.5, 112.5, 157.5, 202.5, 247.5, 292.5, 337.5])
>>> a.bounds.array 
array([[  0.,  45.],
       [ 45.,  90.],
       [ 90., 135.],
       [135., 180.],
       [180., 225.],
       [225., 270.],
       [270., 315.],
       [315., 360.]])
>>> a[1:3] = 999
>>> a.array
array([ 22.5, 999. , 999. , 157.5, 202.5, 247.5, 292.5, 337.5])
>>> a.bounds.array
array([[  0.,  45.],
       [ 45.,  90.],
       [ 90., 135.],
       [135., 180.],
       [180., 225.],
       [225., 270.],
       [270., 315.],
       [315., 360.]])

which I think is fine when RHS does not have bounds (like 999), but I don't think it makes sense when the RHS itself has bounds. Currently this happens:

>>> f = cf.example_field(0)
>>> a = f.dimension_coordinate('X')
>>> a[...] = -1 * a
>>> a.array
array([ -22.5,  -67.5, -112.5, -157.5, -202.5, -247.5, -292.5, -337.5])   # -ve
>>> a.bounds.array
array([[  0.,  45.],    # +ve
       [ 45.,  90.],
       [ 90., 135.],
       [135., 180.],
       [180., 225.],
       [225., 270.],
       [270., 315.],
       [315., 360.]])

I'm not sure why this is so.

I propose extending assigmant to the bounds when both the LHS and RHS have bounds. i.e.:

# Proposed behaviour

>>> f = cf.example_field(0)
>>> a = f.dimension_coordinate('X')
>>> a[...] = -1 * a
>>> a.array
array([ -22.5,  -67.5, -112.5, -157.5, -202.5, -247.5, -292.5, -337.5])  # -ve
>>> a.bounds.array
array([[  -0.,  -45.],  # -ve
       [ -45.,  -90.],
       [ -90., -135.],
       [-135., -180.],
       [-180., -225.],
       [-225., -270.],
       [-270., -315.],
       [-315., -360.]])

(As an aside, I realise that unary operations also ignore bounds but binary ones don't (always) - that'll be another issue, though.)