text: Title: Axes sizes should always match signal shape
  Body: We should ensure that the axes `size` and the number of axes provided to a signal, actually matches the data shape.
  
  Note that there are a lot of new features coming in #2399.
  While one could theoretically provide flexible-size (following signal shape) to `UniformDataAxis` and `FunctionalDataAxis`, `DataAxis` requires a fixed-length array. I think it is better that we for now expect the `size` attribute to match the signal shape when an axis is passed to a signal, and then we can consider a more flexible approach in the future.
  
  As an example of where this can go wrong, currently the following does not raise any errors:
  ```python
  import hyperspy.api as hs
  import numpy as np
  
  data = np.zeros((5, 10))
  ax1 = {'size' : 20}
  ax2 = {'size' : 30}
  ax3 = {'size' : 40}
  axes = [ax1, ax2, ax3]
  s = hs.signals.Signal1D(data, axes=axes)
  print(s)
  # <Signal1D, title: , dimensions: (30, 1|40)>
  print(s.data.shape) 
  # (5, 10) # very different from the hyperspy shape
  ```
  Should be as simple as looping through the axes, and comparing its `size` with `s.data.shape[ax.index_in_array]`, as well as checking the number of axes vs `len(data.shape)`.
  
  I will make a PR to #2399. 