rewrite using Grid and Orientation abstraction
- logic for shifting and combining only written once
- opportunity for animations if desired