Adjust the implementation of smart constructors to generate smaller expressions. For example `epsilon .*. a` could be reduced to `a` and `symbol a .+. symbol b` could be reduced to a symbol group once #2 is implemented.