Improve boolean logic

Currently, complex logic must be accomplished via "abuse" of the `min` and `max` types, which can produce a great deal of redundancy.  The only real logic type is `if`, and that only works with half a dozen variables.

This patch introduces several new producers and consumers of boolean values:

* **not** — accepts a single value; returns `false` if the value is `true`, otherwise returns `true`
* **and** — accepts zero or more values; returns `false` if any value is not `true`, otherwise returns `true`
* **or** — accepts zero or more values; returns `true` if any value is `true`, otherwise returns `false`
* **xor** — accepts zero or more values; returns `true` if there are an odd number of `true` values, otherwise returns `false`
* **greater** — accepts two or more values; returns `true` if each value is greater than the one which follows it, otherwise returns `false`
* **less** (or **lesser**) — accepts two or more values; returns `true` if each value is less than the one which follows it, otherwise returns `false`
* **equal** (or **equals**) — accepts two or more values; returns `true` if they are all numerically equal or string-equal; otherwise, returns `false`

The `if` value type has also been changed to no longer require a "then" clause (i.e. to work with two *or* three values).