evict_oldest and evict_oldest_thumbnails now collect paths, stats, and sizes in one iterdir() pass instead of separate passes for sorting, sizing, and deleting. evict_oldest also accepts a current_bytes arg to skip a redundant cache_size_bytes() call.