Libc I/O calls are functions in a shared library

Rather than macros, as they were before.  This allows us to interpose
on those calls without requiring recompilation.
Add .gitignore