Removes commit() method from RecordChangeSet

The commit() method does not belong in the change set. It implies
 operation on a state tracking object. Proof of that is that only one
 of the two implementations actually makes use of the method.
Adds object pooling and a small optimization in DirectRecordAccess

DirectRecordAccess makes use of Proxy objects quite a lot. This commit
 makes sure they are pooled in a FlyweightPool so they are reused.
Also, the batch set that keeps changes to be committed is now implemented
 as a sorted map so we can write the records in inverse id order, this
 way ensuring that the file is expanded only once for this batch.