Exercise listener simplification

Greatly reduce complexity of `ExerciseListener` by splitting its responsibilities across 4 independent listeners.