Added structs, literal sugar & fixed constraints

Fixed constraint handling (however, error message on failed constraint
inputs is still cryptic, needs work) and implemented the basic struct
parser. This required a new AST datatype to be created to represent an
entire source file (composed of multiple structs, of which "main" is the
struct that will be used for input validation). Continued code refactor
and implemented syntactic sugar for specifying char and string literals.
Error messages across the board need improving yet, as default parsec
errors are very cryptic, perhaps this can be improved with further
optimisations and refactoring (i.e. minimising usage of try combinator)