Avoiding mismatch errors from verification

The problem is that "verification" is done by avrdude, not by the ArduinoISP sketch. Avrdude uses low-level commands to write one page at a time, and then more low-level commands to read back the memory (one page at a time), and compares the read-back version to the sent version.
(Also, the protocol used between avrdude and arduinoISP is pretty stupid, and doesn't offer any good ways to send back a detailed error indication like "I don't think I can program that page because it hasn't been erased.")

Change the Arduino IDE so that any attempt to use the Upload button produces an error message if a programmer has been specified.

Huh? The IDE won't use the configured programmer unless you use the "upload using programmer" option. (or it's shortcut - SHIFT-UPLOAD.) (Is that what this is about? SHIFT-UPLOAD used to be "verbose upload" and now (post 1.0) it is "upload using programmer." This makes a bunch of old advice obsolete...)

If [chip erase] hasn't been done, the flash can't be updated

That's not strictly true. You can change "one bits" into "zero bits" in flash, even if there is already data there.
And the bootloader NEVER does a chip-erase; it can do a one-page erase before each page is programmed, assuming that avrdude doesn't decide to "optimize" by skipping pages that are already all ones.