f9ec09c4

ical-recurrence: fix the lossy golden event occurrence format

The `.occ` golden files that the scenario tests in `ICal.RecurrenceSpec`
read and write are a serialised form of a recurrence set, so parsing one
back has to give the set it was rendered from. It did not, for two
independent reasons.

`renderEventOccurrence` wrote nothing at all for an absent property,
while `parseEventOccurrences` read the file back in fixed two-line
chunks. An occurrence without a `DTSTART`, or without a
`DTEND`/`DURATION`, therefore shifted every occurrence after it in the
file. In practice that meant a scenario calendar for an event with no
`DTEND` could not be expressed as a golden file at all, and a golden
containing one was silently misparsed rather than rejected.

Chunking on raw lines was also wrong on its own. A content line longer
than 75 octets is rendered folded over several raw lines, so one long
property, a `TZID` for instance, was read back as several occurrences.

## Commits

1. The roundtrip property test, which fails on both counts.
2. The fix: write an empty line for an absent property, and chunk
   unfolded lines from `parseUnfoldedLines` rather than raw lines.

## Checks

- `roundtrips with parseEventOccurrences` passes for 5000 generated inputs.
- Full suite: 230 passing, 0 failing.
- The existing golden files are untouched, because every occurrence in
  them has both a start and an end and none of their lines are long
  enough to fold.

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 4s 1s 1s 5s 4s
Eval 5s 12s 12s 18s 0s
Build 1h10m33s 4m24s 1m43s 1h12m17s 1h10m15s
Suite 4s 4m38s 1h12m12s 1h12m17s 1h10m19s

Timeline

0s10s1h10m1h10m1h11m1h11m1h11m1h11m1h11m1h11m1h12m1h12m