make ListenerFn take format and args instead of formatting it ourselves