* Run the model-info search off the event loop and bound it
GET /model-manager/model-info called requests.get straight from an async handler, so a slow or
black-holed upstream stalled every other request the server was handling, not just the search.
Move the lookup to a worker thread and give the three search API calls a connect/read timeout so
a stalled search settles into an error instead of an unfinished spinner.
* Keep remote preview downloads off the event loop
utils.save_model_preview did an untimed requests.get and was reached
synchronously from two async handlers, so setting a model preview from a
remote URL could freeze the server the same way #217's search did.
Move both call sites to asyncio.to_thread and give the fetch the same
(connect, read) timeout the searches now use, shared as
utils.REMOTE_RESOURCE_TIMEOUT. The timeout on its own only bounds the
freeze to 30s; measured on the real PUT route, the thread is what removes
it.
* pref: migrate fetch model info to end back
* fix(download): can't select model type
* feat: add scan model info
* feat: add trigger button in setting
* feat: add printing logs
* chore: add explanation of scan model info