added ability to remove listeners, and fire a listener only once