Change product result to reduce list allocation.

Previously, we were accumulating products by making an ever-longer
list.  This performed okay, presumably because Python is optimistically
over-allocating behind the scenes.  Now we produce a dict keyed by
target/env.  This also lets us detect which products are associated
with which targets and produce some phony targets.
cobble.ninja_syntax: cleanups

- Make methods into module functions where possible.
- Remove duplicate checks.
- Add more docstrings.
- Begin documenting the odd escape behavior.
cobble.ninja_syntax: generalize input types.

Instead of dicts and lists, the Writer now operates on Mappings and
Iterables.  Because this means the possibility of operating on
generators, it's now careful not to evaluate each iterable more than
once.
cobble.ninja_syntax: scope indentation changes

Instead of carrying around the indentation level as an optional
parameter, it's now a member field controlled by with-blocks.
C: switch symlink from implicit to order-only dep.

This keeps Ninja from re-"building" the symlinks if the modification
time changes -- which obviously doesn't affect the symlink.