0f8a764a44
Introduces an exclusive file lock (FileShare.None on wallet.json.lock) held for the duration of a wallet session. A second instance trying to open the same file receives null from TryAcquire and sees a localized error message; UnauthorizedAccessException (OS permission issues) propagates separately so the UI can show a distinct message. The .lock file is deleted on Dispose (best-effort); the real guard is the open FileStream, which the OS releases automatically on crash.