Optim: do not allocate empty array lists
Optim ProducedType: implement a faster supertype lookup
Optim: remember if we are an optional type
Optim: really memoise ProducedType.argList
Util: faster intersection for common tests
Optim: added Declaration.isSetter which is cheaper than instanceof
Optim: memoise Module name
Optim: remove dead code
Optim: iterate over overloads using indices to avoid having to create copies
Optim: added a global cache for ProducedType supertypes

Also added equals/hashCode methods where required to be able to compare ProducedType for the cache
these hashCode/equals do not take alias/canonicity into account but that's OK it's for caching it
does not have to realise that foo|bar == bar|foo
Added Declaration.isFunctional to reduce cost of instanceof
Added Module.getSignature to have a memoised string I can use to identify modules
Optim: iterating array lists with c-for is cheaper memory-wise than via iterator
Remove optim for ProducedType.isOptional because I can't measure its effects
Optim: ProducedType.getSuperType: only do quick type for toplevels
Optim: ProducedType.simpleSuperType: fixed supertype of intersection types
Optim: Util.simpleIntersection: fixed a few bugs
Optim: ProducedType.getSuperType: do not cache if we have underlying types
Optim: Util.lookup: traverse it in the right order, me stupid
Optim: allocate TypeDeclaration.brokenSupertypes only if required