Step 10 of the gui/app.py + gui/preview.py structural refactor. Pure copy: the QObject signal hub that BooruApp uses to marshal async worker results back to the GUI thread moves to its own module. All 14 signals are preserved verbatim. app.py grows another shim line so internal `AsyncSignals()` references in BooruApp keep working. Shim removed in commit 14.