Move variable substitution to an extension

This incorporates the changes from @metavida in #75 of moving shell interpolation into an extension. I also moved variable substitution out, change the naming from "extension" to "substitution", and concealed the external API methods for now. I don't want to expose something that people start using until we like it internally.

I still don't love the pattern of having a module with a `#call` method, but it works for now.