How, exactly, would such a change roll out? There is actually no point in the code (that I could find) that specifically imposes such a cap. The only thing that this cap comes from is the method which the block reward comes from, simply dividing by two. There is a point where the rounding used in the code simply returned zero, and that was when the block reward went to zero. This just so happens to be just under 21 million Bitcoin, which is likely just a coincidence, not a specifically hard coded thing.