Support has_many :through instead of just only has_and_belongs_to_many

`has_and_belongs_to_many` works well for most of use-cases, but it's annoying if we want to:
- Use a custom join table instead of having to follow the rule `"#{self.to_s.tableize.gsub(/\//, "_")}_#{self.role_table_name}"`
- Have more fields in the join table, e.g: `created_at` and `updated_at`

For the above reasons, I added one more option called `has_many_through` to allow developer can use a customized join table by `has_many :through` association.