Вы совершенно правы. Слушатели должны быть добавлены в наборы. Как вы сказали, добавление слушателя более одного раза не имеет смысла. Кроме того, вы не будете полагаться на порядок слушателей, если вы используете наборы. И это самое главное: НЕ НАДО полагаться на это, если вы серьезно относитесь к разработке программного обеспечения, и каждый найденный нами принцип ведет нас к лучшему дизайну: изоляция, независимость, ответственность.
Каждый аспект, упомянутый здесь (многопоточность, производительность, ...), должен подчиняться самому себе в первую очередь, но может быть нарушен после, если у вас есть веские причины. И я имею в виду ОЧЕНЬ веские причины.
Кстати: плохая практика позволять слушателю удалять себя. Добавление и удаление должно быть симметричным. Поэтому слушатель должен быть удален через объект, который его зарегистрировал. Если у вас много слушателей, вы скоро застрянете.