1. The metadata objects weren't being duplicated when duplicating the IR. This meant that the later passes would write metadata multiples times into one store (reference), causing wrong behaviour at codegen time.
1. Adds support for type signature syntax. 2. Lifts the type operators into metdata. 3. Uses the signatures to determine arg suspension.