Jank @olasd's hack, clean up core.

This is about 90% @olasd's code, I was tempted to put him as the author on this commit, but I also made some core changes.

This will likely conflict with the language stuff; don't merge this before that, this is just a request for feedback.

This commit stops macroexpand from being recursive, since that behavior was always wrong.