Oops, a tiny blunder in my previous update, returned an illegal SQL snippet if there were no IDs selected. The list builder should cleverly refuse to do the query in this case, but we'll settle for it doing a SELECT that returns nothing for now.
1. The list builder builds a separate (optionally cached) paginator for each page group, rather than each list. No more filling of the Tcl cache with (say) 5500 forum entries when we know that users rarely march through the entire list of forums.
2. Since the list builder builds an "in (list of ids)" query clause to select just those rows needed for this display page, there's no reason to sort the list of ids so I'm building the list within the list builder rather than using the more generalized paginator code. Minor speedup ...
This could probably be sped up more by simply caching the list of keys within the list builder and replicating some other paginator functionality in lightweight form specific to the list builder, but this will do for now. And maybe forever.