Image registration

This PR adds support for performing image registration on an `Images` object. It is part of the new `improcessing` package, which is designed for image processing routines that are more complex than the simple filtering operations available directly as methods on an `Images` object. The `Register` class is designed as an abstract method that handles distribution; subclasses, such as the initial example `CrossCorr`, implement methods for estimating and applying transformations. 

Key features
- Simple pattern for adding new registration methods
- Helper method for computing a reference image / volume
- Supports both applying the transformation to the images / volumes, or directly returning the transformation parameters

Based on a prototype developed by @d-v-b

@industrial-sloth take a look and let me know what you think?
Very reasonable. I'll make it match exactly our uses of `startidx` and `stopidx` elsewhere (e.g. in loading images). What I did here does match the functionality of `Series.between()` and `Images.planes()`, but we might also just want to fix those as well (in a separate PR).