allMatches method

The returned iterable lazily computes all the non-overlapping matches
of the pattern on the string, ordered by start index.
If a user only requests the first
match, this function should not compute all possible matches.

The matches are found by repeatedly finding the first match
of the pattern on the string, starting from the end of the previous
match, and initially starting from index zero.

If the pattern matches the empty string at some point, the next
match is found by starting at the previous match's end plus one.