A-star solver

Search uses a heap to store the frontier (sum of minimal Manhattan
distances + number of moves). Each node in the frontier also stores
its movesequence. Every time a state is needed, it is generated by
applying the movesequence on the initial state. A state is never
visited twice.

To solve, run solve() in the console.