Return error reasons from DraftNotes::PublishService#execute and consume in API
### Problem to solve REST API consumers of `DraftNotes::PublishService#execute` return HTTP 500 (internal server error!) on _user_ errors such as authorization failures and validation errors. This is because `#execute` returns a bare `#error` without a `:reason` attached. ### Proposal Attach a `:reason` to the different errors and return the appropriate HTTP status for the given reason. ### Background The following discussion from !208487 should be addressed: - [ ] @ngala started a [discussion](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/208487#note_2827772291): (+2 comments) > Question: Should it be `422` instead of `500`?
issue