This link should provide a lot of background information for my issue.
Basically the problem is with Application Events, and cached lightning components.
If your lightning component lives inside a tab, and the user navigates away from the tab, the component is saved in the cache. If the user navigates to the tab containing your component again, there are now two copies of the component in being run at the same time. Which for the most part should not have any issues, but it has lots of problems if you are utilizing APPLICATION events, as each event is consumed by every copy of the component and each copy also fires its own event.
This means 2 copies will incur 4 application event handling calls, and 3 copies will incur 9. Of course anything beyond 1 will be a bug so it doesn't matter anyways.
Until now, I have been using the workaround listed in the above link to prevent multiple Application Events from being called/handled.
When your component with the handler inits, register to some global spot like
$A.theOneTrueHandler = cmp;
Then everytime you handle the event check before doing your stuff
cmp === $A.theOneTrueHandler
However, with the rollout of LockerService and its protection of global objects from being altered, I can no longer utilize that workaround. I am wondering if anyone has found a solution which either kills cached components, or solves the application event propagation issue.