Add type hierarchy for typed plugins

A TypedPlugin is an ImageJPlugin with a particular associated data type
(which can be queried via the Typed interface).

For example, DragAndDropHandler<D> will extend TypedPlugin<D>, since
each DragAndDropHandler has an associated data type it handles.

A WrapperPlugin is a specific kind of TypedPlugin which wraps a
particular instance of its associated data type.

For example, View<D> will extend WrapperPlugin<D>, since each View
wraps a particular sort of data object.
Add a layer for managing typed and wrapper plugins

This layer provides abstract base classes which ease implementation of
services following the "wrapper" and "handler" plugin patterns.
ViewService: use WrapperService layer

This greatly reduces the amount of boilerplate code.
DragAndDropService: use HandlerService layer

This reduces the amount of boilerplate code.

There is still some repetition, mostly to make the javadoc more
intuitive.