compiler: Fix procedures placed in pairs

When placing a procedure in a pair we would convert to the procedure to
<any> which would give it a trampoline with the TopProcedureCell
signature. However, we were storing the original type of the procedure
inside the iv.KnownPairCellValue which means we would try to use the
original signature when invoking the cell.

Add vt.ValueType.replaceProcedureType to let us rewrite to Scheme type
to indicate that we converted the pair to the TopProcedureType. Change
iv.KnownPairCellValue to track the actual stored procedure type.

This is preferrable to preserving the procedure type as that would
require a mechanism to convert pairs of different procedure types
between each other which would be complex and fragile. This way all
pairs have the top procedure type and can freely convert between each
other.

Additionally, add a fix for duplicate error message strings when
creating multiple adapter procedures with different arities. This was
discovered while writing one of the functional tests for the above
issue.
compiler: Fix type of values loaded from pairs

- We should intersect the pair values's Scheme type with the AnyPairType
  before attempting to extract the car/cdr type. We know the value has a
  pair type as it was just cast to AnyPairType. This allows (car)/(cdr)
  from a typed proper list to return a value of the appropriate type

- Perform replaceProcedureType() on the loaded car/cdr type to be
  symmetrical with what ValuesToPair is doing.
stdlib: Add functional tests from SRFI-45

SRFI-45 is the SRFI describing what eventually became the (scheme lazy)
library in R7RS. It contains a lot of useful tests, examples and
explanation that doesn't appear in R7RS

- Add the memoization and reentrancy tests from SRFI-45. These were
  modified to place top level definitions before their first use and use
  (delay-force) instead of (lazy).

  "Reentrancy test 1" in included almost verbatim in our functional
  tests via R7RS. It's omitted to prevent duplication.

- Add a test using (from), (stream-filter) and (stream-ref) from SRFI-45
stdlib: Add procedure type annotations to lazy.scm

This produces slightly better code and serves as inline documentation.