Add compile_blocks_with_return function

This function is the same as compile_blocks except that it places a
return statement on the last block.
Add add_semicolon function

add_semicolon places a semicolon at the end of a string, but will not
produce double semiclons or junk like

console.log('asdf')
;

and etc.
Refactor 'define' compilation to use compile_blocks_with_return
compile_blocks use add_semicolon
Fix syntax in let statement compiles

Let now requires double parentheses on single binds: (let (x a) (x)) no
longer compiles [must be (let ((x a)) (x))]. Also, multiple line suites
are acceptable: (let ((x a)) (print x) (x)) will compile correctly

Also clenaed it up a little.