Upstream deadlines and content[] parity
- gutenberg_browse_popular's complete results now pass enrichment validation instead of always claiming truncation (#8)
- gutenberg_get_text's text_fetch_failed carries its recovery hint and no longer names the resolved mirror URL (#9)
- gutenberg_get_book and gutenberg_search_books state empty and null fields (None, Not available) instead of omitting them, so content[]-only clients can't misread absence (#10, #13)
- normalizeBook no longer drops editors or extra summaries — a new summaries field on Book carries every entry Gutendex sends (#11)
- Catalog and text-mirror retry ladders run under a wall-clock budget (withUpstreamDeadline), so a slow upstream surfaces a declared error instead of outrunning the client's default timeout (#12)
- ctx.log calls in the catalog and text services no longer leak operator-configured base URLs onto the client-visible notifications/message stream (#14)