Extend the unrolling technique to `cast`

This requires specializing `Subset` to "kind" `'[sy ::: t]`, to string along the witness that each element is `~ (sy ::: t)`. I don't know if this is avoidable. We also must add the () parameter.

`myCast :: PlainRec '[Field1,Field2] -> PlainRec '[Field2]` gives the following Core:

    cast'
    cast' =
      \ r_iRv ->
        :&
          @~ <(':) * ("Field2" ::: String) ('[] *)>
          (case r_iRv
           of _ { :& @ t10_iSp @ rs0_iSq @ sy10_iSr rb3_iSs x_iSt xs_iSu ->
           case xs_iSu `cast` ...
           of _ { :& @ t1_i1fb @ rs1_i1fc @ sy1_i1fd rb1_i1fe x1_i1ff _ ->
           x1_i1ff `cast` ...
           }
           })
          ($WRNil)