try..finally for once()

The listener should be removed even if the listiner has thrown an
exception.