Add substitution module.

This commit adds a new module Subst exporting several functions
which provide the capability to substitute an open scalar expression
or open array computation into a variety of entities
(open scalar expressions, open array computations, tuples)
replacing the variable with de Bruijn index equal to zero. (i.e. ZeroIdx).

This necessitated some small changes to the constructor definitions
in the types PreOpenExp and PreOpenFun. This is because it was
exceedingly difficult to write a type-correct substitution
function when types of form 'EltRepr t' were present
in the 'Var' constructor of 'PreOpenExp' and 'Body' constructor
of 'PreOpenFun'.

Occurrences of 'EltRepr t' in these constructors were replaced
with 't'.

The meaning of 'Idx env t' is no longer:
  "an index to a value of type 't' in the  environment"
but is now:
  "an index to a value of type 'EltRepr t' in the environment"

To make this true we had to define a new valuation environment 'ValE'
in module AST. The crucial change is:

PushE :: ValE env -> EltRepr t -> ValE (env, t)

instead of

Push :: Val env -> t -> Val (env, t)

(We still require data type Val for array computations.)

A minimal set of changes to module Interpreter and module Execute
in the CUDA back-end was necessary to use this new valuation
environment.