This extracts as much of the common logic from the nd-transforms as possible into generic functions. With the transform-specific logic handled by the
exec functor. I've also tried to abstract all of the data movement and vector-type reordering into overloads of the various
This does currently keep
c2r as their own special cases since they are subtly different in a few ways.