Sub-expressions now receive context

This change is actually a change back. When Joe and I were designing the Canvas expression language we decided that sub-expressions would receive the same context as the function they were an argument too. We removed that for a long time because it caused problems when type checking the input context for the subexpressions. Wat?

Ok, let me explain, take a look at:

foo | bar baz={beer}

Up until now, in every released version, bar would receive the output of foo, but beer would receive no context all, aka a null context. With the change I just made beer will now receive the same input as foo.

This didn't work previously because what if beer required a null context? Well presumably foo doesn't output beer, so you would receive an error. A few updates again, quietly, we I introduced the ability for the interpreter to cast from a special wildcard type. Now there's a from on the null types that says "Here's how you make a null from anything". With that change, the interpreter sees that foo outputs whatever, and beer requires null, and it looks at the null type and says "Ok, I don't know how to convert whatever, but this '*' rule says to just run this function and I'll get a null from anything, I'll do that"

This change mostly impacts conditional statements. Now you can do stuff like:

esdocs index="heartbeat*" fields="monitor.host,monitor.duration.us" sort="@timestamp, desc"
 | mapColumn "isAwesome" fn=${
  if {getCell "monitor.duration.us" | compare "lt" to=200000} then="Awesome" else="Just OK"
 }
 | mapColumn "isAwesome" fn=${
  if {getCell "monitor.duration.us" | compare "gt" to=3000000} then="Not Awesome" else={getCell "isAwesome"}
 }

This says: Pull a couple fields from the docs in the heartbeat* index, sorted by @timestamp. Now create a new column called isAwesome and if the monitor.duration.us field is less than 200000, set isAwesome to "Awesome". Otherwise set it to "Just OK". Then if that field is greater than 3000000 set isAwesome to "Not Awesome", otherwise just set it to whatever it currently is. This all works because the context is being passed deeply down the nested sub-expressions. Neat right?