Combine character sets where possible.
Use Dict.fold for simplicity.
Re-implemented Pattern.literalString using Substring.foldBack.
Modified Pattern.repeatExact so it creates right-associative Concat patterns as in the new Regex smart constructors.
Fixed the way Pattern.Optional is rewritten in 'preprocessMacro'.
Check for empty charsets first before combining them.
Move Graph.fs above Regex.fs, since we'll eventually move the graphs to a separate library.