Закрывает замечания ревью QA по PR #50:
* #54: все чтения Store идут через Database.read() под тем же RLock, что
транзакции; контракт «одно соединение, все операции под локом»
задокументирован в db.py и README модуля. Устраняет TypeError/IndexError
на общем соединении, грязные чтения и выдачу состояния, которое затем
откатывается падающим apply.
* #55 D-1: apply ловит BaseException — отмена/CancelledError/
KeyboardInterrupt вызывают Applier.revert(previous) и пишут failed в
audit_log (без «висящей» записи staged); падение revert попадает в detail.
* #55 D-2: set_geoip_schedule читает old_value внутри той же транзакции.
Refs #20, Refs #54, Refs #55