Optimize statistics cleanup

Perform a single transaction for cleaning up the flow. Also use
System.nanoTime() for keeping the expiry time and keep it constant.

Furthermore, use HashMap instead of ConcurrentHashMap to gain better
memory peformance. This requires synchronizing between the statistics
update and statistics cleanup -- which actually is okay, as it closes
the race between an update happening precisely when a flow entry would
be retired. With the lockless design that entry could be lost, simply
because we'd get undefined ordering between cleanup and update
transaction commit.

Change-Id: Iceaee5b44643075d325f664af774a9c6841bcfc6
Signed-off-by: Robert Varga <rovarga@cisco.com>
Merge "Optimize statistics cleanup"