[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 also don't have a preference, so let's leave it. The argument that @rybakit is making is valid. But someone else could make the argument that calling `$token->getUser()` before the `if` statement could in theory mean that you're calling this function even if you don't need the user (i.e. if `supportsAttribute` returns `false` for all attributes). Both are micro-optimizations, but you can't support both. Also, even though we're supporting it, you really *shouldn't* be calling the voter with an array of attributes - so that makes this even a little less common.

Thanks guys!