I think the way we're doing input introspection isn't completely right. I think we're using GL_PROGRAM_INPUT as a catch-all that includes buffer attributes, but this breaks down in #143 because there we need the gl_WorkGroupID and whatnot.
So I think we need to separate out the usage of attributes to come from glGetProgram with GL_ACTIVE_ATTRIBUTES and then supplement that with an additional inputs attribute.