Refactor the rendering and caching logic of SelectQueue into a generic SelectObject

Now it's much easier for extensions to build cached object selection
lists, simply by wrapping SelectObject.  Keeping track of when the cache
needs busting is still left for external management.
Merge branch '4.2/generic-object-selector'