I followed Mioriin's suggestion and pressed e at the GRUB prompt to edit the config. Then I found the line starting with linux and ending with splash and added a 3 to the end. Then I pressed F10 to boot.
This brought me to a textual TTY screen where I could enter my username/pass and was able to run CLI commands normally. I ran pacman -Syu, hoping that if I let it update itself successfully the problem would magically go away.
It appears that the python package dateutils was installed, and was causing pacman's update to fail. It seems that pacman tries to do big updates in a single transaction, to avoid partial update state due to interruptions, but despite this I think my system got borked by the update attempt.
I uninstalled dateutils with pip uninstall python-dateutils. Then I ran pacman -Syu again and it completed successfully. I ran pacman -Syyu just to make sure that the update was good, and it reported no out-of-date packages. I then also ran pacaur -Syu in the same fashion. After this I checked dateutils with pip list and it appears to have been installed back by the pacman update.
I rebooted and my computer, including GUI, worked as before.