In my experience the least error prone and (strangely) fastest method is simply to clear all the blocks of light within the maximum range that could be affected (+-16 in your case) and recalculate them all.
The iterative method when adding light gives nice results but I have found to be much slower; presumably due to the overhead of maintaining lists of blocks that need updating and adding/removing from it as you run through the algorithm. In removing light the iterative method is also bug prone as light can "leak back around" as you're finding; that a block previously at 14 light loses its connection to the sun and so is recalculated; finds a block of light 13 nearby and sets its own light to 12 (rather than all of them being set to zero).
The solution I have used is to clear all the light levels then make a sweep downwards; Gathering light from the 9 blocks (in 3D, 3 blocks in 2D) above each block. Light is decayed for the 8 (or 2 in 2D) blocks that aren't directly above and setting the light level to the maximum value from those 9 blocks. This allows light to travel downwards at up to a 45 degree angle; this can give quite harsh shadows which may or may not be what you want. Repeating the sweep going upwards can alleviate the harsh shadows as can imposing a minimum light level that all blocks have regardless of sunlight.