Lazily yields lines in batches. Still O(n) if fully consumed.
Iterable<String> get lines sync* { for (var line = 0; line < lineCount; line += 256) { yield* lineRange(line, line + 256); } }