DefaultIOService: add missing final keyword
DefaultIOService: skip event when nothing saved

If no saver was found, we should not broadcast a DataSavedEvent. Doing
so is inconsistent with the open method, which only publishes a
DataOpenedEvent when non-null data was actually opened successfully.
WrapperService: fix create method return type

It will -- and should -- always return an instance of PT specifically.
That is the point of the generic typing on plugin type: to define and
guarantee use of that specific type. Not just "WrapperPlugin<D>".

This change will eliminate a few hacky casts downstream, too.
Add a location service for managing data locations

A data "location" is a path (source and/or destination) that points
to data. Many data locations, such as files on disk and remote
URLs, can be represented as strings, so the LocationService knows
how to wrap a string as a data location of the appropriate type.
Add location plugin backed by a file on disk
Add location plugin backed by a byte array
WIP: migrate SCIFIO I/O package to SJC

Still needs lots of cleanup and restructuring to better fit the SJC
plugin/service model.
WIP: clean up handle + stream classes
POM: bump to 3.0.0-SNAPSHOT

After this point, there will be breaking changes to org.scijava.io.
Revamp the recently used files service

It is now the RecentService, and supports any type of Location,
not just String file paths.
WIP: Use Location, not String, in the I/O API