major reimplementation, rewording, refactoring

started (mostly) over by condensing all interactions to use only one
associatedObject, and two Pulse-specific methods through
performSelector:afterDelay: and some tricky argument passing. also
added a bunch of really helpful comments and refactorings to make the
whole thing much better and easier to understand