IOService: add higher-level load(File) method

This method takes a File as input and produces a data object, where the
type is not known a priori. If the file contains image data, it uses
IOService#loadDataset; if it contains text data, it uses
TextService#asHTML(File) to obtain an HTML string.
DefaultRecentFileService: fix NPE

The issue was caused by the recent rename of OpenImage to OpenFile,
since the DefaultRecentFileService has the fully qualified class name of
that command hard-coded at the moment.
OpenFile: use new IOService.load(File) method

This eliminates the "business logic" from the OpenFile command in favor
of using a service. In this way, others who need the same functionality
can also use the service rather than needing to invoke the command.
Merge branch 'io-unify'

This branch simplifies the OpenFile command to lean on the IOService
completely. It also fixes a related bug in the RecentFileService.