They simply don't exist in the most general case. It is not a black/white, but more of how much grey can you stand before things fall apart.
Every abstraction eventually turns into a giant ball of mud once you exceed the design scale of that abstraction. People bag on Rails, but Rails is a great abstraction as long as you stay with it's limits.
Assembler is a perfectly awesome abstraction, but the scale at which you can use it effectively is pretty small.
Where things get "leaky" is that an abstraction is actually two things; the concept itself and the larger domain in which it lives. Leaks occur when you move the boundaries of the domain w/o updating the abstraction.
BEAM messages are a great example of this, as long as the number of nodes is less than X, it works reasonably well and you don't need to have detailed understanding of the mechanism to use it effectively. However, once you exceed X, details of the implementation become extremely important and you need to redesign a new abstraction to work in the larger domain.