Application of solar differential rotation compensation to mapcubes

This PR provides for the application of solar differential rotation to mapcubes.  It generalizes the previous "image coalignment by template matching" code by creating a function (apply_shifts) that applies shifts to a mapcube, and returns a mapcube.  This function is used by both the image coalignment and solar derotation functions.  All the functions in the PR should now only accept input using astropy units where appropriate, and return astropy units, where appropriate.

A question: at the moment both the "image coalignment by template matching" and solar derotation functions clip the mapcube by default, to take account of the image shifts  The resulting mapcube has data at all times and positions.  Perhaps the default should be no clipping so the user sees even more obviously that the data have been shifted in some way?  With no clipping some positions and times in the mapcube will have no data in them.  Questions? Comments?
Isn't `m.scale` a quantity like `px/arcsec` ? If it's so, then we wouldn't need to do `xshift[i].value`, with the multiplication the final result would be `px`.. whcih should add properly with `crpix`... but we may not have all that properly implemented in map...