snapshotFlow
Observable view of the persisted sigil triple — emits the current value on subscribe + a new value after every persistSigil or clear call.
Cross-VM consumers (WalletPanelViewModel in particular) collect this to react to sigil identity changes. Specifically, the wallet panel transitions out of WalletStatus.SigilRequired when this flow emits a non-null snapshot — without it, the wallet stays stuck on "sigil required" until the user manually re-taps a wallet action.
Backed by an internal MutableStateFlow that's updated on every write through this class. We don't rely on SharedPreferences.OnSharedPreferenceChangeListener because it fires on the main thread with no delivery guarantees under pressure — this is more direct and predictable.