Don't Merge This PR. It still need improvements.

This PR does the following things:

1. Add LayoutComponent Class which is a pure data class. 

2. Add `doLayout` method in ui::Helper class to perform the actual layout work.

3. Refactor original Widget-tree to use the new method to do layout.

4. Add tests to verify the refactor and new feature