Custom typchecking of records

When type-checking a record against a record type, it will now check
the fields, rather than synthesize the type of the record, and compare
the types. This allows us to avoid a lot of type annotations on record
fields.
Tuple notation `(e1, ..., en)`

A tuple `(e1, e2, e3)` is syntactic sugar for the record `{1 = e1; 2 =
e2; 3 = e3}`.