Implements the pow_dimsym dimensional power type

This enables things like allowing a function signature ``(fixed**N * float64) -> N * float64`` to create an output dimension which has the same size as the number of input dimensions.

A further natural thing to do is to want to make the output shape before that ``N * float64`` to be the same shape as the input. This will require a further extension to allow named typevars constrained by a pattern type. A possible syntax for this is ``(A: fixed**N)``, and the signature for this goal would be ``((Dims: fixed **N) * float64) -> Dims... * N * float64``. This isn't implemented yet.