refactor: separate presentation from business logic in service layer
Remove HTML generation from ContentService and handlers, moving all
presentation logic into templates. DisplayItem is now a pure data struct
with EmbedType enum to let templates decide how to render content.
Key changes:
- Service layer returns structured data instead of template.HTML
- Templates use conditionals to dispatch based on EmbedType
- Added template functions (irclinkURL, truncate, safeHTML, safeURL)
- New templates for link_posted and no_search_results pages
- Navigation and embed styles moved from inline to CSS classes
- Updated tests to verify data fields instead of parsing HTML