OpenFile: cancel when appropriate

Instead of using the IOService.open convenience method, we get the
opener ourselves. If no opener, log a warning to the user.

If an opener exists and we get back a null dataset however, we should
cancel ourselves.