simplify the code in updateRecord()

changes:
- each metric handles what writer to use and how to use it
- MetricCollection will fetch a new metric to update record 
- MetricCollection handles how a new metric is returned

When a new metric is added, all we have to do is have the metric declare what writer to use and how to use it. (Like the way we did with RecordFilter and RecordReader)
That is what we use originally (before I start refactoring the code).
When I separate MericCollection and RepoUpdateService, a null pointer is returned instead of a metric. However, it seems working fine when this declaration takes place in RepoUpdateService. I'm running locally against stack 53. The keys looks fine. I'll double check the data once I have more data.