Explicitly register each UI listener rather than through some magic

This (1) allows UISparkListener to be a simple trait and (2) is more intuitive, since it
mirrors sc.addSparkListener(listener), for all other non-UI listeners.