Improve SourceLocation::operator {<,>}.

If x is a real thing and y isn't, x should be both less than y and greater than y: y is a non-entity. We still need (x < y) != (y < x), but this fixes some SourceRange "which of these things is the beginning" logic.
Add some recursive "is this a ${foo} file" checks.
Drop implicit 'in' and 'out' action parameters.

Don't assume that there is an 'in' parameter and an 'out' parameter: that is a Ninja-ism that actually isn't extremely compatible with the way we want to write things in Fabrique. For instance, you might like to define:

lex = action('${LEX} --header=${header} ${in} -o ${out}');

but Ninja's implicit 'out' variable will incorporate both 'out' and 'header'. We should thus stop using 'in' and 'out' as parameter names.

This commit takes the first step by no longer automatically providing an 'in' or 'out' parameter. This simplifies dag::Build, removing the implicit vs explicit distinction. A future commit will make 'in' and 'out' reserved words.

This commit also has the side-effect of allowing input-less actions (e.g. "run this tool to generate something").
Add ast::List::elements().