Added `dataset.make_numpy_array_or_scalar` to help put the errors arguments into proper shapes.
`Spectrum.add` implements erorr propagation (error) addition.
`Spectrum.sub` implements error additions.
Due to array bradcasting errors are no longer added in place.

The problem is:

    a = np.array([1, 2, 3])
    b = np.array([[1, 2, 3],[-1 ,-1, -1]])

then
   * a + b work
   * a += b fail
   * b += a work

Would this ever be problematic? Don't want to go into premature optimizations...