Add start, finish, and bounce events

Also, clean up state machine for tracking when the effect is running.
Previously, we could get confused if we started and stopped the effect in the
same callstack.