Available for every component

This add an `~available:Features.t` argument for each component combinator. It may not make sense on each of these but we can restrict that later. My aim is to first get a good `As_project.t` data structure (e.g. remove the mutable fields) and corresponding public API to construct it. We can still try to restrict it later, if it turns out to be problematic for Makefile generation.

The commits have more details.