edge reveal finishing touches

* fixed revealing with a width that was 1px too thick
* done profiling `reveal_edges`
Adding tests
Major changes to edge finding algorithm

Edge finding is 4-5 times faster than it was before. The improvements:

* Edge finding happens in a chunkwise fashion. The image is divided into --chunksize pieces.
* The image is sliced by contiguous rows that do not yet have an edge index.
* Rows of the image that already have an edge are ignored. This is how the chunkwise approach pays off.

Important lessons learned:

* Fancy indexing (i.e. `img[a1, a2]`) MAKES A COPY of the array! Contiguous slices (i.e. `img[0:15]`) are the only option.
* Reducing the background to a simple number (i.e. 255) is important
* Avoiding `np.abs` is important
* Slicing up the image to avoid processing pixels that we no longer care about is important
* Separating out the logic that handles finding contiguous slices of the image is important. It's too complicated to sprinkle that among other logic.
Edge revealing improvement

Fixed edge revealer highlighting the edges of the image if an edge wasn't found for the given row.
ckiss must invoke the edge finding before mutating