Add tool chain variant type and combinators

Add ToolChainVariant data type, a variant field to ToolChain and
a combinator for modifying a function depending on the toolchain
variant being used.