MessageThrottler
Aggregates bursty plugin messages so players receive one summary chat line after a quiet period instead of a flood. Cooldown window is getNotificationThrottleSeconds. Policies: CURRENCY — sum amounts; flushed message uses existing chatCurrencyShowerMessage template. NO_XP — count occurrences; flushed message is the latest rendered message, suffixed with " (xN)" when N >1. QUEST_PROGRESS — keep latest rendered message; keyed per objective so concurrent quests don't clobber each other.