* fix(downloads): abort blocked model fetches on cancel
requests.get() has no way to abort while it is still resolving,
connecting, or waiting for response headers — which is what an
unreachable download server looks like. The cancel flag was only
checked between response chunks, so Cancel sat until the request
timed out. The blocking open now runs on a helper thread the caller
polls every 200 ms; on cancel it raises at once while the abandoned
attempt stays bounded by the existing timeouts.
The settings dialog's download workers also reported "Model ready to
use" whenever the apply returned True, but reconfigure() can no-op
when the selection matches live state — success without a download.
They now pass force_reinit so a reported success means the engine
actually initialized the downloaded model.
Fixes#679
* fix(downloads): bound cancel openers, close late responses
- Track blocked request opener threads and give each attempt its own stop
event so a cancel-and-retry cannot stack unaccounted requests and a
response landing after cancel is closed instead of leaked
- Catch requests.exceptions.RequestException in the opener instead of a
bare Exception
- Close the streaming response on the mid-stream cancel path
- Make the blocked-open test helper cancellable and reap tracked openers;
check each download worker call site for force_reinit separately; add
missing return annotations on new test helpers and methods
---------
Co-authored-by: Jatin K Malik <jatinkrmalik@gmail.com>