events: once(): Execute listener *before* removing it.

Code that relies on the existence of the listener being present
will fail should it be removed before the listener is executed.

In addition to swapping the order of the listener execution and
its removal I've wrapped it in a try/catch block. This is to
guarantee (like the old code did) that the listener will be
removed even if the listener itself throws an error.

If we don't care about maintaining that compatibility it'll be much
cleaner and nicer to just remove the block.