GWCS proposal

This is based on the discussion on June 17 regarding dimension mapping and "stages" of a higher-level transformation.  This is just an example WCS -- it's probably fastest to just provide examples and talk about them, and then a schema can be formalized later.

It adds the concept of "steps" to the overall WCS pipeline, and removes the assumption that the transforms are always pix-to-world or world-to-pix.

One advantage of this example is that the overall structure of the transformation (which is unlikely to change for a given instrument/configuration) is separate from the specifics about the parameters on those transformations, which vary for each exposure.  It's still probably more flexible than it needs to be, since you could replace the rotation part of the linear transformation with a skew and which probably wouldn't make any sense...  One could push this idea even further and fix all of the transformation types and provide a mechanism to pass numerical values into an otherwise static structure.

The `in_map` and `out_map` feature here is a hybrid of what's in `jwst_lib.modeling` on every Model, and Erik's proposed concept of naming dimensions.  In working through the example, I didn't have a need for it outside of separable transforms.  I'm starting to wonder if it needs to exist outside of separable transforms.  Even for the case where you just want to swap axes, you can always insert a separable transform, which leads me to think we should just rename it to "axis mapper" and consider it the swiss army knife you pull out when the axes need rearranging.

Anyway, hopefully this can be something concrete around which to have concrete discussion.

@perrygreenfield, @embray, @nden, @bernie-simon
Generally speaking, this sort of step removes distortions as well as mixing between coordinates. For the most part for optical/uv/ir observations, there are usually only two input detector coordinates, and from this x, y, and lambda come from (where x,y here imply spatial dimensions though this is probably confused with the input pixel dimensions so a different name is probably needed. Two very common examples (both true for JWST) are : 1) it it is a long slit spectrum where neither the  original x or y pixel coordinate is solely associated with wavelength (usually one is mostly, but it isn't purely), and there really is only one spatial degree of freedom (position along the slit) but it corresponds to correlated changes in ra an dec on the sky as you move along the slit and these are the target spatial coordinates. So the transformation in this case aligns the slit coordinate with one pixel dimension, and wavelength with the other. Generally when you do that, you often remove any other distortions (but you don't have to). 2) an IFU where you effectively have several long slit spectra, each one corresponds to a different spatial offset perpendicular to that of the slits. Now you map 2 coordinates to 3, where all 3 can vary independently (for 1, there were really only 2 independent output coordinates since if  you pick an ra, you usually determine what the dec is that corresponds to that).