Improved Container Allocation in the YARN Runtime

currently we are having random problem with allocating evaluators of different memory size, especially when the requested evaluators' sizes are not requested in ascending memory-size order.

this PR is to tighten up our container allocation logic.

The scenarios with different requesting orders that have been tested (<1, 512MB> means request of 1 evaluator of 512MB):
```
1)	<1, 512 MB >  <1, 2048 MB >
2)	<1, 2048 MB >  <1, 512 MB >
3)	<2, 512 MB >  <1, 2048 MB >
4)	<2, 2048 MB >  <1, 512 MB >
5)	<1, 2048 MB >  <2, 512 MB >
6)	<1, 2048 MB >  <1, 1024 MB >  <1, 2048 MB>
7)	<1, 1024 MB >  <1, 2048 MB > <1, 1024 MB >
```
Can we catch more precise exceptions?