Also output type of AST node if we have one.
Add Bytestream::ErrorMessage format.
Make OSError Printable.
Clarify some POSIX errors.

Specify that we're trying to create/read a directory.
Fix a test's expected error message output.

Commit 0c7dabf9 changed the error message but didn't update the test.
Refactor OptionallyTyped mixin out of Identifier.

We might use this elsewhere, but it also lets us output type information of optionally-typed things using RTTI in a generic (i.e., not naming a concrete class specifically) way.
Move AST printing to the Parse() function.
Don't pass srcroot and buildroot rundundantly.

We already pass a FabContext, which knows the source and build root directories, to Parse().
Make UserError Printable.
Centralise driver exception handling.

Put everything that can throw an exception within a single try block at the top level of the Fabrique driver.
Add more detail to action parsing test.
Massive type system rewrite.

Provide a proper hierarchy of Type types, using polymorphism, etc. to make decisions about "is this a subtype", "can I add this to that", etc.

Unfortunately this commit has to be monolithic.
Add [<>] operators to Source{Location,Range}.
Let SourceRange::Over rearrange begin,end.

We want a SourceRange over the two things, no matter what order we supply them in.
Add Type::isString().
Fix target passthrough.

A target is either a reference to a file or else a reference to a list of files. Put the logic that distinguishes between them in one place.
Create a Value::asList() method.

Some values can be represented as lists (e.g. List, Target); we shouldn't need RTTI and casts to use them.
Use the new Value::asList() in foreach iteration.
Implement addition of files and strings.

Well, addition in which the file appears on the left. We ought to implement the other thing, too.
Use curly braces around variables.

Using the curly-brace syntax makes things make-compatible and doesn't hurt ninja compatibility.