Fix: Incorrect model being used as Controller::$modelClass

We cannot be sure that Controller::$uses have not been iterated, so
reset the array to use the first value.
Throw exceptions when invalid permission keys are used.

Silently 'failing' to save permissions is bad, throw exceptions instead.

Fixes #3851