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.