Add context and service disposal logic

This provides the ability for a service to explicitly clean up its
resources, and implements such cleanup for the core services.

There are currently two significant reasons for this feature:

1) The DefaultLegacyService of ImageJ2 disallows multiple instances of
itself, since there can only be one concurrent legacy ImageJ. But it is
fine to allow instantiation of a new DefaultLegacyService as long as the
first LegacyService is disposed first (e.g., in the case of long-running
lists of unit tests).

2) Currently, ImageJ2's QuitProgram plugin calls System.exit(0)
explicitly, which is extremely unsafe. With context disposal, it can
simply dispose the ImageJ2 context and the JVM will terminate if (and
only if) there is no other reason for it to remain active.

And in general, anything using the service framework will benefit from
the ability to cleanly shut down its context without hardcoding a JVM
shutdown.