compiler: Parameterize vt.ReturnType

vt.ReturnType was used to represent both Scheme return types (as in
procedure types) and native value return types (as in native function
declarations). As there was no distinct type or type extraction code for
the two cases they could be freely mixed with interesting consequences

Instead parameters ReturnType so it can be either a
ReturnType[ValueType] or ReturnType[SchemeType]. Appropriate type
annotations actually make this fairly painless. The only major code
change required is separating ExtractType.extractReturnType in to
extractReturnSchemeType and extractReturnValueType