fix(download): sanitize filenames + surface failures via notification
Two concrete fixes for "downloads often do not work":
1. Sanitize the filename before path.join — replace path separators,
control chars, and other filesystem-hostile characters with
underscore; substitute timestamped fallback for empty / "." / ".."
names; cap to 200 chars while preserving the extension. Defends
against silent setSavePath errors on edge-case Content-Disposition
names.
2. On download `done` with state !== 'completed', show a "Download
Failed" notification with the cancelled / interrupted reason.
Previously the failure was console.log-only and looked indistinguishable
from "didn't start" to the user — feeding the "often do not work"
perception even when downloads were cleanly cancelled.
Adds unit test coverage for sanitizeDownloadFilename (mirrored helper
in session-partition.test.ts, matching the pattern already in use for
resolveUniqueDownloadPath).