Rethinking the water strategy
Finite water will not work on infinite maps, and water has never really behaved predictable and well anyway. I´m instead going to try a model that focuses on making water do what one WANTS it to do, as a player, rather than on trying to make it simulate some kind of blocky physics thingie.
The idea is to make a purely local model, with two types of water: Flowing and Static.
* Static water doesn´t move as long as it´s on top of ground or other water, and will spawn Flowing water next to it on any free tiles.
* Flowing water has a direction, which is visible in the texture, and will push object in it along. Flowing water will never be more than two tiles deep, and will flow towards the nearest lower tile within a small radius (5 blocks?) of its location.
* Flowing water not connected to static water will turn into air.
* Small bodies of static water turn into flowing water if there´s a slope nearby.
There are some quirks with this system, such as small lakes being able to sustain infinite waterfalls and so, but it gives the control of creating and removing lakes firmly in the hands of the player.
Unflooding a cave will be as easy as just closing the hole, and the flowing water will go away.
And since this is a purely local model, it works in infinite, and is MUCH faster than the old system.