fast and accurate calculator

lexer -> parser -> simplifier -> calculator (optional)

lexer:
- number (decimal, hexadecimal, binary and octal), stores the number to display the expr result within the same base as the numbers.
    There can be spaces, and apostrophes between numbers to group them into hundreds for example
- plus, minus, ...
- parentheses
- identifiers (predefined function names and constants)
- brackets for the abs function
- good error handling

parser:
- pratt parsing
- implicit multiplication
- functions can have multiple arguments separated by commas
- good error handling

simplifier:
- identifies parterns and replace things to simplify
- TODO: more about this
