John, the basic problem is that CG skin doesn’t maintain a fixed distance from CG Bones. The vertices are connected to each other, the bone just gives them a displacement or rotation from their previous location. The question is really not how to eliminate deformation, but how to minimize it. The simple solution is to do your modeling with the limbs near the center of the expected range of motion. Arms lowered half way to the hips, elbows bent at a 90 degree angle, fingers curved as if holding a softball, and so on. Then do some experimentation to find how far you can bend the joint before the inevitable deformation becomes too noticable. I find it’s generally around 60 to 90 degrees.
Since real range of motion runs from 160 degrees or so for an elbow or knee, up to 360 for the shoulder, you won’t find an ideal solution, just a compromise. That’s when people start resorting to extra deformation bones, fancy contraints, shape keys, py drivers, and so on.
Weight painting is somewhat of a chimera: it will help increase the range of motion, but never to the point where you want it. Since weight painting is fairly tricky, you may wind up with the impression that if only you were better at it, you could achieve the results you want. Unfortunately, that seems to be an attractive but blind alley.
tolobán is probably the expert at avoiding deformations who posts here regularly, check out his thread on Muscle simulation experiments (nude female model). There are links in that thread to other methods, as well. Toward the end of the thread he shows a good set of shoulder edge loops, and I suspect something similar would work for elbows and knees as well.