Refactor: handle grub item states with state machine

- Also handles plain JS events in place of core async madness