Re-implement popup passthrough more robustly

Commit 35f48d24bf5c broke popup passthrough a bit, unfortunately. It
works for the context menu, but not for the menu bar.

It is time to ditch the unreliable onpopupshowing/onpopuphiding and
checking properties on root windows for determining if popups are open.

Now we simply just loop through all menupopups and panels and check if
any of them are open. If so, don’t do anything. Otherwise, proceed as
normal.
Improve popup passthrough check performance

Commit 468ed83 sure made the popup passthrough check more robust.
However, querying for all popups (hundreds) and looping them through on
each keypress is not optimal for performance. The solution? Use the best
of both of the old and new passthrough check.

Looking back, the issue with the old event-based passthrough check was
not that passthrough sometimes wasn’t triggered. It was that passthrough
sometimes got stuck, effectively disabling the extension. So it is not
the 'popupshowing' event that is unreliable, it is the 'popuphidden'
event. So we now use the events for toggling passthrough mode, just like
before. But when `popupPassthrough == true`, we don’t trust it. Then we
loop through all popups to see if any of them actually is open. This
means that it is only when a popup (might) be open that we use the more
expensive check, which is a good tradeoff. Even then, you probably won’t
even notice a lag or anything.
Merge pull request #265 from lydell/better-passthrough

Re-implement popup passthrough more robustly