LegacyUI: don't display on separate thread

This was based off the AbstractUserInterface's show() implementation, to
show a display off-thread. However, this causes problems in the legacy
layer where we depend on side-effects, such as registering an ImagePlus
in response to display creation.
DefaultLegacyOpener: factor out OpenFile

Instead of always using the OpenFile command, we will use a focused
GetPath command only if given a null path. Then we will use the
IOService directly.

This prevents unwanted dialogs to pop up, for example, if no format is
found.
DefaultLegacyOpener: cache services

Ideally we would just use context injection here. However, the
instantiation in DefaultLegacyHooks is too early for context injection
to work right now.

So let's at least cache these services between open runs.