Factorize some code in the parent class

Moving the implementation to the parent class will make it much easier
to implement the Quick engine, as it will share most of the behaviour of
the Cangjie engine this way.

Later on, we can special case stuff if desired.
Some input chars don't have any associated radical

When typing 'z' with Cangjie version 3 (Traditional Chinese only), the
engine raises an exception because there is no candidate (radical) for
the letter 'z' alone.

This fixes the issue, by simply displaying the letter itself instead of
a radical.
Update our bundled copy of pycanberra

I updated the pull request I had submitted upstream to avoid
the dependency on the six module.

This just takes that latest submitted version.
Move some code around

We only try to display the candidates (or play an error, or auto-commit)
when we get them, so we might as well put it all in the same method.