Thanks for your review, Terry.
Popping from the end is not an implementation of rule 2. Calling event handlers is separate concept from binding/unbinding event handlers. The "doafterhandler" list contains bind/unbind requests that were made while calling event handlers. The doafterhandler "queue" should be FIFO, not LIFO.
Code note 1:
The running time of the algorithm is an important consideration. Your last suggestion for using a for-loop looks most appropriate, as you've said. Attached is a revised patch for it.
Code note 2:
The _ComplexBinder class may need refactoring, but that's a separate issue. I'm willing to review patches for that.