Concretely specify the type of dims in SubArray

This allows the type of `size(S::SubArray)` to be inferred.
Add return-type annotation to ngenerate/Cartesian method cache
Enhance ncall so only the last argument is expanded on itersym

This allows one to pass additional "pre" arguments
Add @nsplat, a convenience for generating explicit versions of functions with a splatted argument
Test inference of returned types
Implement copy! using Cartesian

Fixes #5411
Bump CARTESIAN_DIMS to 4
Merge pull request #5671 from JuliaLang/teh/cartesian

More Cartesian housekeeping, plus implementation of copy!