Workaround for performance bottleneck in ShortcutManager.

Whenever a new keyboard shortcut is registered, the ShorcutManager class
traverses the whole database to find and remove expired shortcuts.
This is especially expensive in the case where several input files are
open in ilastik and a new viewer is initialized for each file. Each of
these viewers register several shortcuts of their own.

Keeping a reverse map from the parent widgets to shortcuts belonging to
that widget speeds up the _purgeDeletedShortcuts() method to make this
use case with several input lanes in ilastik workable again.

This is a quick workaround. We should rethink the design of the
ShortcutManager class.
Small performance improvement for ShortcutManager.register()

In order to find existing shortcuts with the same keymap, The
ShortcutManager class queries each existing shortcut in its database
for its keymap. Since there can be only one active shortcut with the
given keymap, it's enough to keep a dictionary from keymaps to shortcuts
to avoid this lookup.

Note that the ShortcutManager class needs further work. This design
choice does not match the way its used from ShortcutManagerDlg for
instance.
shortcuts: wip: Rewrote ShortcutManager for speed and also to just work properly (called ShortcutManager2 in this commit).
shortcuts: New implementation supports saving/loading preferences
shortcuts: Moved ShortcutManagerDlg to shortcutManagerDlg.py, and modified it to use the new ShortcutManager (still called ShortcutManager2 in this commit, but soon to change)
Deleted old shortcutManager.py
shortcuts: Renamed ShortcutManager2 to ShortcutManager
shortcuts: Comments.
Merge branch 'shortcuts'