Linked image viewers and docked plugins

This PR adds the ability link image viewers by passing in a `Plugin` (instead of an image array) to an image viewer. The `Plugin`'s output image gets rendered in the viewer, and updates to that plugin trigger updates to the viewer. Linking allows you to create a processing pipeline to interactively view multi-step processing operations.

As part of this update, plugins can now be docked to the image viewer. Docking greatly simplifies window layout (so that linked viewer aren't initially displayed on top of one another) and in general, looks a bit cleaner, even for single-viewer examples.