Multiple Dispatch
This PR adds initial support for typing and multiple dispatch to Morpho. You can define multiple implementations of the same function:
fn f(List x) { .. }
fn f(String x) { .. }
and morpho will dispatch to the correct implementation based on the type at runtime. Multiple dispatch resolutions are compiled to a special implementation (a directed acyclic graph) for efficient execution, imposing typically only a 20% overhead on a regular function call per argument. Future compiler optimizations will reduce the need for this.
Multiple dispatch can similarly be used for method definitions, and are resolved at runtime. PR includes extensive tests and online help.
Typed variables and support for type tracking in the compiler are implemented, but type checking is not fully implemented yet. (This PR is a necessary step towards full type checking).