refactor HDFS state and it's tests

Refactor HDFS state and it's tests. Add CheckpointState as the super trait of it.

This first refactoring attempt is not changing any behavior of the origin HDFSState. The intention is to separate out the super trait, CheckpointState.

Also refactored the tests to remove code duplication.

This is confusing as to why it is needed, since it looks like CheckPointState is just routing fail to it. Why is this useful? Can you explain the state machine more clearly? Because I don't understand it as well with this model.