Unit API cleanup and tweaks

The A2_write_cb callback takes a subsample start time instead of
an A2_vmstate pointer. Units that need something from there will
have to set that up in Initialize instead. (The A2_vmstate never
moves during voice/unit lifetime, so it's perfectly safe to save
pointers to it or its fields privately.)

The 'frames' argument has turned into a 24:8 fixed point
'duration' argument.

A2_ramper is now subsample accurate - supposedly. Needs testing!
It also got a naming convention fix, and a proper initialization
call; a2_RamperInit(). (It was just dumb luck that we could use
a2_SetRamp() for initialization before.)

The engine core and all units have been updated accordingly.

Bonus: Minor cleanup around the interpolation in wtosc. It's now
possible to build with linear interpolation and no oversampling,
by defining A2_LOFI.

Closes #49.