Revert "Revert "stm32_i2c: ensure that unexpected ISR can't overwrite stale data""

This reverts commit 7a7a07ed0ec492b3ab9f87467189886a66b2fc1a.
stm32_i2c: fixed timeout handling

thanks to hxxnrx@gmail.com for noticing this
stm32_i2c: ensure we don't change priv-> after semaphore is released

this prevents a race condition where a subsequent I2C transfer could
be lost

Many thanks to hxxnrx@gmail.com for reporting this bug
stm32_i2c: check for msgc underflow in I2C ISR

a spurious I2C interrupt could cause priv->msgc to underflow, leading
to memory being overwritten. This seems to have been the cause of at
least some of lockups we have seen
stm32_i2c: handle more unexpected ISR conditions

this clears the interrupt for more unexpected ISR conditions that
otherwise lead to an ISR storm. When that happens no user threads are
able to run as the I2C ISR is continually raised

Thanks to Lorenz for help in tracking this down