Fix: `dt-api cell().invalidate()` and `dt-api cells().invalidate()` now invalidate only the cell(s) in question and not the whole row.

Previously the whole row was invalidated as a quick workaround for what
I would would be a complex task, but the solution is actually relatively
simple and small in code size, reusing much of the current invalidation
code. The cache data for the whole row is still removed, but the
important part of minimising the DOM interaction is in place.
Dev: Tests for the cell invalidation update