Add CopyShared

Commit 2/3 to add some Copy* templates that make it easier to declare a variable with a different type from another variable but with the same storage class. Ex:

    shared int i;
    CopyShared!(char, i) c;
    pragma(msg, typeof(c)); //shared(char)

The helper template Typeof is code that I factored out from CopyConstness. Once this PR gets merged, I will change CopyConstness to use Typeof.