refactor(file-upload): extract NamedRegistry base into @cv/utils, TextExtractorRegistry extends it
TextExtractorRegistry was hand-rolling Map-backed register/unregister/get/getAll - the same pattern is duplicated in several other 'Registry' classes across the monorepo. Hoisted that scaffolding into a generic NamedRegistry<T extends Named> in @cv/utils so subclasses only declare the domain-specific lookups (findForMimeType, etc). Throws on duplicates with the subclass name in the error so future Registry subclasses get a sensible error out of the box. Added tests for the base behavior.