Can't self-service cancel a participant record unless status is "Registered".
It's not unreasonable for someone to want to cancel if they're waitlisted (to make room for others); one can imagine a range of scenarios in which a participant record should be canceled when status isn't "Registered".
I went to fix this, but the code here is overall bad. Plenty of values are hard-coded that shouldn't be, and logic that belongs in the BAO is in the form. I expanded the range of cancelable statuses, but also did some cleanup to move the logic out of the form layer.