iterate on a copy of the listeners array when firing, in case firing results in listeners being added/remove.