Add __array_interface__ to FunctionChain
This dunder attribute specifies how numpy converts objects to arrays. Since FunctionChain is currently iterable, this means np.array(chain) will result in array([*chain.functions]) which is arguably not what one wants.
Alternatively, __iter__() could be removed. It's not really necessary as functions is exposed.