Prevent name inference for contracts in some cases

When TR is generating contract names for caching or for
reducing duplication, it doesn't make sense to use the inferred
names.
Provide names for opaque object/c
Better contract generation for Name types

This avoids the huge blowup of serialized contracts
Trust types for the framework
Support polymorphic recursive type contracts again