1. Why does notifyWhenStateChanged() execute callback immediately when state != source?  2. Do we need to clear listeners for each state change? 