fix some scoping issues

see right A in initialization of B in (let ((a 1)) (let ((a 2) (b a))))
rename variable if multiple symbols print to same name
handle some type declarations better, allow (return (values)) for void
update todo list
rearrange function initialization a bit
remove some debugging print
rewrite part of inference to avoid leaking constraints between passes

instead of trying to replace unified types with result of unification,
make them point to result and replace on use