Fixed and intuitivized exception handling

abandoning pull request #1281 for this.

the rationale for this is to

1. fix some logic flaws
2. make errorhandlers more intuitive by making them rely on exception hierarchy instead of registration order

and all this while without breaking compatibility in not-already-broken usecases (which rely on the logic flaws i fixed)

TODO:

1. bake this into some tests as well
2. one error says

    > It is currently not possible to register a 500 internal server error on a per-blueprint level.

    why is this?
Hmm, this seems like an awful lot of indirection. Now we have a magical dictionary inside another dictionary, where the magical one falls back to looking up in other magical dictionaries if it couldn't find any errorhandler. Couldn't we bake all of this logic into ``_find_error_handler``?