So turns out, I made a big mistake.
I didn't realize that RX goes to TX and TX goes to RX, not RX to RX and TX to TX. I was misreading some schematics and was very confused.
But it works!
However, the relay footprints still need fixing (I just bodged it for now), it needs better AC isolation design/fusing, and I'm still not sure why it occasionally browns out. I'm using an 800mA 3.3V regulator and it's drawing, at most, 120mA. Maybe I need bigger capacitors on the power rails.
I've discovered something about this heater - the heater itself is never meant to be on without the fan. If air is not being forced over the heater, it gets incredibly hot and starts to glow and smoke slightly. That's a problem if the fan fails, for sure. I've added code to ensure that the heater is never on without the fan, but still.
I'm going to be testing it for a while to ensure that it doesn't become a fire hazard.
There are a few worries with this thing:
Like I said, I haven't figured out why the 3.3V sometimes drops out, and it can occasionally get into a state where it keeps browning out forever and never comes back up. This could result in a state where the heater is on and the fan is not, which is a hazard.
So yeah, it works! Over the coming hours/days I'll be uploading everything that you would need to recreate this project, along with lots of warnings about possible safety hazards!