Issue #3613099: Extract dashboard charts into cacheable top-active blocks
Closes #3613099
Both dashboards' charts were built from whichever 10-row table page happened to be showing, embedded in a page render array forced to max_age: 0 for the live quota table. On a site with hundreds of editors or roles, that's a meaningless, non-cacheable slice that changes with every page flip.
Replaces them with a dedicated block per dashboard (top 5 by usage volume this month, matching the by-role table's existing ranking), wrapped in #lazy_builder so a render-cache hit skips the query entirely. blockAccess() replicates the dashboard route's permission; cache varies by url.query_args:month and user.permissions.
Tests: 17 new (ranking, SQL-level limit, empty-state regression, cache metadata, tag invalidation, cache-hit query-count reduction) plus the existing 224, all green.