RunArgument: make --run behavior consistent

You can pass either a class name or a command title. But previously, the
class name version did not consume an options string as a third
argument. We now do so in both cases (and if there is no third argument,
we assume the empty string).
OpenArgument: do not force the UI to show anything

Rather, we simply create a display for the opened object. If the UI is
later shown, it now takes care of showing the display which was created.
And if not, no big deal.
AbstractUserInterface: don't show displays twice

If a display is already being shown, the show method just returns.

This may become a problem if we decide to support multiple simultaneous
UIs, but for now is better than the display popping up multiple times,
which was previously the case if you manually called
UIService.show(Object) followed by UIService.showUI().
DefaultUIService: remove warning if no viewer

We now use the getDisplayViewer method to determine whether a display is
already being shown in the UI. But this caused the warning to appear
every time a display was not currently being shown. It is not really an
invalid state for a display to have no viewer instance yet.
DefaultUIService: fix race condition in lazy init

I was lazy when converting services over to lazy initialization, in that
I did not handle multiple threads properly. It is not actually that hard
to do: just make a boolean state flag, synchronize the initialization
method, setting the state flag upon completion and returning early if
the flag is already tripped. In this way, if a bunch of threads all try
to call a service's methods at once and trigger multiple lazy
initialization calls, only one of them will actually do the work and the
others will block until initialization is complete.

This change fixes a race condition when launching ImageJ with the
"--run" argument.

We should replicate this pattern for the other lazily instantiated
services...