It seems that the ESP is producing a lot of noise on GPIO.0. And I can get it to work if I tie GPIO.0 to GND instead of letting the USB-serial bridge control it (via esptool).
The USB-serial bridge does, in fact, pull that line low. But I think it only weakly pulls it low. And once it's released it bounces all over the place.