Task T7 preacher evidence

Implemented App\Services\NameTagResolver::preacherFor(Service $service).

Covered behavior:
- Non-empty services.preacher_name_override wins and is trimmed.
- Without override, services.preacher_name (CTS Predigt role) is returned.
- Without both fields, first visible non-song sermon agenda item is resolved by agenda_sermon_matching patterns via AgendaMatcherService.
- Multiple responsible entries are supported with comma-space joining; empty/missing names return null.
- No override, no CTS preacher name, and no sermon responsible returns null.

Responsible JSON findings:
- ServiceAgendaItem.responsible is cast to array.
- Existing sync test stores associative object shape: {"name":"Max Mustermann"}.
- New tests cover the expected multiple-person list shape: [{"name":"Anna Müller"},{"name":"Tom Klein"}].
- Resolver also supports string entries and firstName/lastName or first_name/last_name fallbacks.

Sermon detection used:
- Prefer configured Setting key agenda_sermon_matching, split by comma, matched with AgendaMatcherService::matchesAny().
- Only visible non-song agenda items are considered (is_before_event=false, service_song_id IS NULL).
- If no setting exists, title/type substring fallback accepts predigt or sermon.

Verification:
- RED before implementation: ddev exec php artisan test tests/Feature/NameTagResolverTest.php failed because App\Services\NameTagResolver did not exist.
- GREEN targeted: ddev exec php artisan test tests/Feature/NameTagResolverTest.php -> 7 passed.
- GREEN full suite: ddev exec php artisan test -> 532 passed (2659 assertions).
- Pint: ddev exec ./vendor/bin/pint app/Services/NameTagResolver.php tests/Feature/NameTagResolverTest.php.
- LSP diagnostics clean for app/Services/NameTagResolver.php and tests/Feature/NameTagResolverTest.php.
