Separate legacy filesystem and database code paths: Catalog GET
### Summary
Refactor the catalog GET handler in `registry/handlers/catalog.go` to separate the legacy filesystem code path from the database code path, as part of the effort to improve maintainability described in &20922.
### Context
**Route:** `GET /v2/_catalog`
**Current file:** `registry/handlers/catalog.go`
**Handler method:** `HandleGetCatalog`
### Current State
The handler currently uses conditional branching to switch between database and filesystem metadata backends. This creates cognitive overhead and intermingles actively developed database code with legacy filesystem code.
### Goal
Separate the two code paths following the pattern established in [!2766](https://gitlab.com/gitlab-org/container-registry/-/merge_requests/2766):
1. Extract legacy filesystem logic into a dedicated method in a `legacy_*.go` file
2. Main handler method contains only database logic
3. Backend selection occurs at the dispatcher level
### Acceptance Criteria
- [ ] Legacy filesystem logic isolated in `legacy_catalog.go`
- [ ] Main handler contains only database logic
- [ ] Dispatcher selects appropriate handler based on backend configuration
- [ ] API conformance tests pass for both database and legacy configurations
### Related
- Parent epic: &20922
- Proof of concept: [!2766](https://gitlab.com/gitlab-org/container-registry/-/merge_requests/2766)
issue