My first stab at this, so I may have gotten it horribly wrong, especially since this is a lazy pass.
I've preserved the way in which it is currently lazy, but any better suggestions are welcome.
Also, I'm not sure about the Optional<> result. And there's the somewhat ugly mutable member, but that's just instead of having the const_cast in the previous version. James, I think you introduced that, if you prefer to go back to the const_cast, I don't mind.
(I wanted to try to port something simple just to see how this works, and BDCE looked liked it ought to be simple enough - but it relies on DemandedBits, so...)