IP: Use custom detection queue.

The constructors of each task is using a lot of memory for some
reason. We have a difficult bug that seems to be copying image data
when they should be lazy. It look like we don't have light weight
copies of DiskImageView and its internal BlockRasterize View.

This is a partial hack to work around that problem. This generates
tasks on demand of each thread finishing ... this is so we can wait
and not have each jobs allocation happen at one time.

detector: Remove excessive casting

operator() and process image are both applying a
pixel_cast_rescale. This commit removes one. This also adds an echo
when the thread ends.

detector: Use image view base

detector: Use a custom queue

This means tasks are now generated on demand. Because I couldn't work
out what was causing a copy in a constructor ... this is an
alternative fix.

Add notify

detector: Clean up code.