[Refactoring] Gather assignment/construction handling into AssignExp

This is necessary for:

1. Standardize internal AST to handle NRVO form more.
2. The future behavior fix around initialization of multidimensional array
3. Improve a little mess code in AssignExp::semantic

And this is based on #2677, because it will reduce number of  internal temporary variable creation.