Dependent types can be feasibly added and fat pointers are already supported in hardware (on a couple of exotic architectures, but still).
I don't see much problems with multithreading, though memory model formalization should be quite interesting.
Garbage collector of some sort seems inevitable in any case. Perhaps with some kind of region inference to help with short-lived allocations. In some limited cases it may be possible to use static proofs of correctness.