That is going to be exceedingly difficult. As long as we are using IP addresses in applications and we are hiding the actual reachability of the address from the application, we are guaranteed to be allowing an application to pass along an unreachable address.
Note that this is a result of the layering violation of passing around an IP address in the application. Asking us to warp the world to support architectural mistakes strikes me as suboptimal.
| (A=B) and (B=C) gives (A=C) where '=' is "can communicate with" | | and | | (A->B) gives (B->A) where '->' is "can send data to"