compiler: Avoid needless procedure conversion

- Introduce "convertProcType" flag on IntermediateValue.toTempValue.
  This can be used to disable all procedure type conversions.

- Change KnownProc.toBoxedValue to always return the current boxed value
  instead of calling toProcedureTemp. This prevents it from attempting
  to convert the procedure type anyway when toNonProcedureTemp is called

- Check the target procedure's signature instead of its type when
  determining if we need to do a procedure type conversion. This is
  required now that toBoxedValue is less eager to convert procedure
  types.

- Have Parameterize pass convertProcType=false when collecting the
  TempValues for the parameter procedures. This prevents it from trying
  to convert the procedures from their existing type to the
  TopProcedureType.

- Have PlanLambda pass convertProcType=false. When we restore from the
  closure we don't want to have our captured self value converted.
compiler: Fix multiple conversions of same proc

Whenever a KnownProc cell was converted to a new type we were
overwritting the entry point with the required adapter procedure.
However. However, if a procedure was converted to multiple types the
previous conversions would have their entry point overwritten.

Fix this by treating KnownProc procedure conversions like converssions
of unknown cell values: create a new adapter procedure cell that points
to the original closure.

This is less efficient if the original closure won't be directly used
but this fixes a real bug and can be optimised later