Smartdown evaluation engine

Also added a command line script in `bin/smartdown` which can evaluate smartdown.

I feel like this is testing lambda equality when really you could use doubles or `Object.new` which would have the same behaviour.