- Dropped all `Quantifier` classes in favor of `Range`
- Added quantifier merging: `x.many().many() == x+`, `x.maybe().many() == x.some() == x*`
- Added `RegexPattern.repeat()` and `RegexPattern.__mul__` as aliases of `RegexPattern.x_times()`
- Added `Range.or_more()`, `Range.or_less()` and `Range.to(count)` (check "Repeating patterns" in docs)
- Added `Chars.to(other)` and `Literal.to(other)`: e.g. `pattern("a").to("z")` is the same as `char_range()`
- `pattern(one_char_string)` now produces `Chars`
- Chars now render differently depending on content:
- Contents are now sorted and optimised by merging overlapping parts, e.g. `[01-9a5]` would be rendered as `[0-9a]`
- If Chars instence consists of one part and it is one symbol, it renders just that symbol: `[x]` -> `x`
- Ranges of length 2 and 3 are rendered just as characters: `[0-1]` -> `[01]` and `[0-2]` -> `[012]`