Extract shared markdown segment writer, DRY importers, add RRULE descriptions
Add write_markdown_segments() to shared.py to encapsulate the repeated
segment-creation loop (mkdir + render + write imported.md + track files).
Replace inline loops in ICS, Obsidian, Kindle, and Gemini importers.
Delete Obsidian's _window_notes() duplicate and use shared window_items()
with ts_key="mtime", tz=None instead.
Parse RRULE from ICS VEVENT components and render human-readable
recurrence descriptions (e.g. "Weekly on Mon", "Every 2 days, 10 times")
via new _describe_rrule() helper.
Tests: write_markdown_segments coverage, RRULE description unit tests
(weekly+byday, daily+interval, monthly+byday, count, until, yearly, empty),
render with recurrence, process segments with recurring event.