Threaded Client Zooming for performance

Using a separate thread allows the new Bitmap to be generated outside
the UI thread, then applied once to the image. This lets us "queue"
consecutive scrolls of the wheel whereby we ignore things in between