Better handling of struct pointers

- `print structptr.member` now works
- attempting to print a pointer variable that is nil will no longer panic
- attempting to print a member variable of a nil struct will no longer panic
- added a bunch more tests for error conditions
Might as well just use `addr` here. It isn't used after being assigned to the local, so we shouldn't have to preserve it.