Issue #3595883: sweep decrypted export bundles left by interrupted downloads
Audit follow-up. VaultExporter writes a fully decrypted ZIP of the owner's whole vault to private://pdv-export/{uuid}.zip (a raw path, not a managed file). VaultExportForm only removes it via deleteFileAfterSend(), which fires on a completed download. A dropped or errored download therefore leaves the plaintext archive at rest indefinitely: core's temp-file cron never touches that path and nothing swept the directory.
Fix: GarbageCollector::collect() now runs a bounded reapStaleExports() step that deletes export bundles older than EXPORT_MAX_AGE (1h); VaultExporter::EXPORT_DIR is shared (made public) so the path is not duplicated. Uploads under private://pdv-uploads are unaffected (managed temp files, already reaped by core + the form finally{}).
Kernel test testReapsStaleExportBundles: a stale bundle is swept, a fresh one survives (fails without the fix).