Primitive refactor v2

Refactor primitives into pointers to go primitives. See #61 for some discussion.

Add fail capability to compiler tests for runtime errors. Just prepend the name with `fail_` as usual.

Guarantee that tests are failing at the appropriate layer by linking them to the previous layer.
- link all tests to the previous layer of testing
  - compiler -> semantic checker & parser
  - semantic checker -> parser
What's going on here with `()` and `_` in `rand_var_gen`?