Make renameArguments operate on NodePath objects.
Make hoist operate on NodePath objects.
Hoist function declarations during the hoisting traversal.

Since we're using the NodePath#replace method now, there should be no
problem with declarations interfering with each other.
Don't create new NodePath objects when calling emitter.explode.
Simplify AST handling.
Pass existing NodePath to recast.print to avoid new allocations.