Use an intermediate representation to reinterpret the value in Target::paintAsType

The comment ``We support up to 512-bit values.`` probably gives this away.  The idea is to be able to paint between types of **equal** size without aid of a union.

ie:
```
int[2] arr = [low, high];
double d = *cast(double *)&arr;
```
Would be on the compiler side interpreted as:
``encodeInteger(low, buffer + 0)`` and ``encodeInteger(high, buffer + 4)``

This isn't actually done here in this PR because CTFE support should come first, but this adds the baseline support to be able to do it.