Better handling of headers and internal vs. external symbols
We should split the installable headers out into a separate include/
directory and clearly distinguish them from internal ones. When doing shared library builds, we should think about symbol visibility and be careful about namespace pollution.