Issue title: Better organize chain.db and reduce storage 
 Issue body: <!-- Please only use this template for submitting enhancement requests -->

**What would you like to be added**:
When working on separating index, found there are 2 improvement opportunities to better organize chain.db and reduce storage
1. block is stored using hash (instead of height) as key, to access a block by height is quite complicated: height->hash lookup --> getBlockValue() --> getDBFromHash() --> getDBFromHeight() --> db.Get()
2. block is broken into header, body, footer and stored separately 

**Why is this needed**:
First, if we use height as key, the block can be stored using CountingIndex and set bucket.FillPercent = 1.0 to significantly reduce storage.
Access a block by height would reduce to getDBFromHeight(), then CountingIndex.Get(height)

Second, I tested the time to read block data from DB. Reading block header (286 bytes) takes about 20 micro-second, reading the entire block (2940 bytes) takes about 118 micro-second.

Since this time is only 0.1 ms, I think it is not necessary to store block as header, body, footer separately. The entire block could be stored under 1 key instead of 3 keys, further reducing storage
 Comments: 
 Comment 0: specific todos:
1. store raw block using counting index, height as key
2. store height->hash mapping using counting index, height as key
3. hash->height mapping remain the same, no change
4. clean-up and improve funcs: getBlockValue(), getDBFromHash(), getDBFromHeight() 
 Comment 1: already doneinn latest code
{'source': 'GithubIssues', 'repo_name_with_owner': 'iotexproject/iotex-core', 'issue_id': 521966578, 'repo_stars': 2507.0}