Refactor ListeningTask

The previous implementation only read 2 bytes (= 1 data point) and then
the thread slept for 5ms. Over and over. This implementation is
inefficient and also has a bug since the thread was suspended for more
than 5ms which resulted in a lesser data point count as there should
have been.

This refactoring changes the implementation so more bytes (aka data
points) are read from the stream. Then a batch of calls to inform the
registered listeners is invoked.
Fix calculation of timestamp for data point