Introduce type-erased writers to C backend codegen
This reduces generic instantiations of several write functions.
Before:
```
@as(type, io.writer.Writer(*array_list.ArrayListAligned(u8,null),error{OutOfMemory},(function 'appendWrite')))
@as(type, io.writer.Writer(*codegen.c.IndentWriter(io.writer.Writer(*array_list.ArrayListAligned(u8,null),error{OutOfMemory},(function 'appendWrite'))),error{OutOfMemory},(function 'write')))
```
After:
```
@as(type, io.GenericWriter(io.Writer,error{OutOfMemory},(function 'write')))
```