fix: atomic writes for voiceprint .npz files
Write to a temp file (.tmp.npz) then rename to the final path,
preventing CRC-32 corruption from concurrent write contention.
Fixes all three production write paths: _save_voiceprints_batch()
in bootstrap.py, _save_voiceprint() and _remove_voiceprint() in
routes.py.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>