cleanup listeners on detach