Basic pattern matching plus other improvements

Support for basic pattern matching
Support for recursive data types
Improved type inference with checks against type parameters (generic typing)
Changing java-ization of names to retain snacks name casing to allow types and functions with similar names