compiler: Add codegen constant cache

This creates a module-wide cache of constant cell values created by
codegen. At -O2 this will rarely make a difference due to LLVM's
constant merging. However, this fixes a real semantic problem on -O0
where the lazy instantiation of constant values can cause duplicate
values to be created for the same storage location. This means (eqv?) on
the exact same storage location would return #f

This also has the benefit of making static (memv) and (member) easier to
implement as it won't have to worry about returning a duplicate list
tail when a value is found.
compiler: Static (memv) and (member) planning

This builds on top of the constant cache work to support (memv) and
(member) on constant lists. This is more powerful than the reducer
version in a couple of ways:

1) Even if the needle is non-constant its type constraints can be used
   to determine if it's non-matching. For example, a non-constant value
   of type <integer> couldn't appear in a list of symbols

2) The reducer was strict about the list having to appear inline in the
   call to (memv)/(member) to avoid duplicating list tails. The constant
   cache lifts this restriction and allows us to operate on any known
   constant list.

This also adds a unit test for (case) which is built on top of (memv).
It's equally a test of the inliner but that seems to have been
sufficiently robust to handle (case) without modifications.