Programs — build, save, and assign for real
The training-program builder is now wired end to end:
- Save persists. "Save program" writes your plan — days, exercises, and set/rep targets — to the database instead of just flashing a label. Re-opening a program loads its real content for editing.
- Assign works. Once a program is saved, assigning it to a client creates a real assignment, and the client sees the full plan (days → exercises → sets) in their app. Assigning replaces their previous active program.
- No more silent no-ops. Trying to assign a program you haven't saved yet now tells you to save first, rather than pretending it worked.