[SPARK-4721][CORE] Improve logic while first thread put block failed

1. make thread which wait old block info try one by one while the first thread which created that block failed.
2. use reentrantLock instead of this.syn{} in block info.
This should probably be placed next to the previous group of variables (the one that holds `failed`, `pending`, etc).  It should also be private.