making AsyncChain typesafe by using a separate builder that maintains
the type per function addition.

also use the iterator instead of copying the array - more idiomatic
java, and this should make things "a bit" more efficient.