But, I do like to understand why things don`t work as expected.
Usually, because your expectations are wrong.
In the serial monitor you type 12 and press the enter key or press send.
OK.
This means there are three chars in the buffer waiting to be read, ascii 1, 2, and the new line char
That depends on what line ending you have selected in the Serial Monitor. There are three choices. None, CR only, CR and LF. We don't know which you have selected, so we don't know that this is a true statement. There may be 2, 3, or 4 characters sent.
It does not mean that the 2, 3, or 4 characters arrive instantly, either. There WILL be a period of time when there are 0, 1, 2, 3 or as many as 4 characters waiting to be read, depending on when you get around to reading them.
the code reads the first two chars, leaving the nl char in the buffer, so I would assume that Serial.flush would have cleared the buffer of the nl char, but it does`nt.
Of course not. If you are using 1.0.1 as you say, then you need to go back an more carefully read what the flush() method does.
In 1.0 and later, flush() blocks until the outgoing buffer is empty. Is no longer has ANYTHING to do with the incoming buffer.
You MUST read every character. Get over it.