[SPARK-3161][MLLIB] Adding a node Id caching mechanism for training deci...

...sion trees. @jkbradley @mengxr @chouqin Please review this.
It would be cheaper (and maybe easier) to pass an Array[Map[Int, Split]] (replacing NodeIndexUpdater with Split).  You already have that info when you construct nodeIdUpdaters in DecisionTree.scala, and you don't have to explicitly store the left/right child IDs.  You can compute child IDs from the parent ID using Node.leftChildIndex (and Node.rightChildIndex).  Hopefully that simplifies the code some.