Owns the workbook state and runs transactions against it. Hosts normally go
through api::Workbook, which wraps this and keeps derived state
(validation and conditional-formatting shadows) in step.
Take (and clear) the message of the most recent rejected action. Global to
the process, not per workbook. Prefer ActionEffect::error_message, which
carries the same text.