Refactor opts

Refactor *Opts in order to make the code more consistent and easy to read.
Before the PR, we had some opts that used Custom type, other the utils.ListOpts, some validations by type, some somewhere else.

This PR tries to clean things up.