Как и где правильно осуществлять валидацию данных в MVC?
UserModel::public function register($name, $email, $password);
Регистрирование нового пользователя это ну никак не метод UserModel. Методы моделей - это действия, производимые с объектом модели. Если бы он был статическим, это ещё куда ни шло.
Вообще странно у вас всё устроено. Вроде бы пользователь только регистрируется, т. е. объект UserModel должен создаваться по окончанию процедуры регистрации, а у вас $user приходит на вход postRegisterUser(..., UserModel $user). А ещё потом это $user->find($request->get('id')). Что ещё за id? Если пользователя только собираетесь регистрировать, у него ещё не должно быть id, или я что-то не понимаю? Ну это так, к слову...В документации к различным фреймворкам, я вижу что-то вроде $form->isValid() и ни слова о том, что происходит далее.
Чтобы понять, что происходит дальше, нужно понять, что же собой представляет $form. Это класс формы, хранящий внутри себя список названий полей ввода (в вашем случае 'name', 'email', 'password'), а также все необходимые фильтры и валидаторы для этих полей. Форма, строго говоря, ничего не знает ни о контроллерах, ни даже о UserModel, её задача - принять, отфильтровать, проверить данные, вернуть список ошибок, если данные не корректны. Для каждой html формы создаётся и конфигурируется свой класс формы. В итоге получаем что-то вроде:public function postRegisterUser(Request $request)
{
    $form = $this->getRegisterForm();
    // Передаём данные $_POST. Ключи не перечисляем - форма сама разберётся, что взять
    $form->setData($request->getPost());
    if ($form->isValid()) {
        // Получаем уже отфильтрованные данные
        $data = $form->getData();

        // Регистрируем нового пользователя
        $user = UserModel::register($data['name'], $data['email'], $data['password']);
    }
}

static public function register($name, $email, $password) 
{
    // Регистрируем нового пользователя
}
Все зависит от архитектуры приложения. В идеале каждый класс должен работать только с безопасными данными, то есть прошедшими все необходимые проверки.
Если предполагается, что ваш класс USER может быть использован где то помимо контроллера и в него могут быть переданы не безопасные данные (например вы работает на крупным проектом в команде и есть возможность, что некий член команды в каком то своем методе создаст экземпляр класса USER) то валидацию лучше проводить внутри класса USER (ваш третий вариант как я понял).
Если у вас не большой проект и класс USER используется только в контроллерах, то более правильно делать валидацию в контроллере, так как в этом случае вы обрабатываете запрос, проверяете его корректность тем самым обезопасив данные и уже смело можете передавать их в класс USER для регистрации.