Handle forward declarations, other updates

* Keep track of empty structs as possible forward declarations, and
  replace with actual definition if found.
* Add a `zero` function initializer for immutable `Array_<type>_<num>` structs.
* Passed in `rewriter` function is now expected to handle all
  elements of an output buffer array, which might include
  `Strings` or `Expr`s