Replace BEXPR_get_n with application and three new combinators.

We add BEXPR_prj for constant projections, BEXPR_aprj for
array projections, which admit an expression argument,
and BEXPR_inj for injections.

This also fixes the horrible situation where the application
of a case term such as

  (case n of T) a

could be either a projection or an injection, depending on the
types involved. This is still the case in the concrete syntax,
however the back end now clearly requires either a projection
or injection to be applied, and a BEXPR_case can only be used
as a value, not a function.

Currently, the projection and injection functions do NOT
come with automatic closure wrappers. This breaks a couple
of regression tests, but it isn't a bug (just an omission :)

You have to write the wrapper youself at the moment:

// Replaced temporarily since injection function
// closures aren't implemented yet ..
// val f1 = case 1 of U; val u4 = f1 4; print u4; endl;
val f1 = fun (x:int) => (case 1 of U) x; val u4 = f1 4; print u4; endl;