fix(security)(CVG-57): bound PDF/DOCX parser execution time via withTimeout
pdf-parse, pdf2json, tesseract-ocr, docx all now race their parse against a hard timeout (15s default, 60s for tesseract). A malformed input that would have hung the parser indefinitely now returns a failure result so the extractor chain falls through cleanly. Note: this closes the hang vector but not the OOM vector - true memory isolation needs node:worker_threads with resourceLimits, tracked separately. Today: input is 10MB-capped, magic-byte validated (CVG-58), and Node's --max-old-space caps the process.