observers now automatically clean themselves up when their targets are deallocated