[Security] add an AbstractVoter implementation

| Q             | A
| ------------- | ---
| Bug fix?      | no
| New feature?  | yes
| BC breaks?    | no
| Deprecations? | no
| Tests pass?   | yes
| License       | MIT
| Doc PR        | TODO

The idea is to reduce boilerplate required to create custom Voter, doing most of the work for the developer and guiding him on the path by providing simple requirements via abstract methods that will be called by the AbstractVoter.

P.S. This is meant to be a [DX Initiative](https://github.com/symfony/symfony/issues?labels=DX&state=open) improvement.
I believe we had this conversation previously here: https://github.com/symfony/symfony/pull/11183#discussion-diff-14016704

The implementation here is consistent with how the core voters (e.g. RoleVoter) handles multiple attributes, which I think is the best we can do. Imo, people shouldn't pass an array of attributes, since it's not obvious how that will be handled. But if they do, we'll handle them in the same way as the core voters (and of course, you can always not use the Abstract class if you need to customize this detail).