Issue title: How do you compare `ErrorCode`s? 
 Issue body: If I have the following:

```python
        results = ga_service.search(self.client_customer_id, query=query, page_size=page_size)

        try:
            yield from results

        except GoogleAdsException as ex:
            <'error handling here'>
```

There is a lot of information in `ex`. The examples in this repo print the exception `request_id` and the name of the status (`ex.error.code().name`)

Instead of accessing the status, which can be general, I want to access the actual failures, 
`ex.failure.errors`. 

```python
for error in ex.failure.errors:
    if error.code == <'not sure what to do here'>:
        <'process individual failure'>
```

---
A use-case I have is that I want to trigger a certain code path if we receive a `CLIENT_CUSTOMER_ID_INVALID` and a different one if we get a `CUSTOMER_NOT_ACTIVE`. Using the `StatusCode`, both of these errors have a status of `UNAUTHENTICATED`. 

My thoughts are that you need to create your own `ErrorCode`, but I am not having success with that using
```python
error_code = client.get_type('ErrorCode', version='v1')
```

Any ideas? 
 Comments: 
 Comment 0: I expected to be able to at least used the `AuthenticationErrorEnum`, but I cannot figure out how that might work either. 

An example:

```python
In [432]: exception.failure.errors[0].error_code                                                        
Out[432]: authentication_error: CUSTOMER_NOT_FOUND

In [433]: authentication_error = client.get_type('AuthenticationErrorEnum', version='v1')               

In [434]: authentication_error.CUSTOMER_NOT_FOUND                                                       
Out[434]: 8

In [435]: exception.failure.errors[0].error_code == authentication_error.CUSTOMER_NOT_FOUND             
Out[435]: False
```
 Comment 1: Hi @wesleybowman It looks like you're on the right track for finding the values you're looking at. `UNAUTHENTICATED` appears like it may be an auth error coming from the OAuth endpoint and not the Ads API.
 Comment 2: > appears like it may be an auth error coming from the OAuth endpoint and not the Ads API. Are you able to authenticate properly and make successful search queries?

@BenRKarl I actually made the query crash so that I could try and compare different errors.
This isn't isn't about the error that I am getting, it is more about the following:

We have customers that will get these different errors, and I want to send them down different code paths depending on which error they get. I think using a `StatusCode` doesn't give us enough fine grain control over these errors, so I was wondering the proper way to compare the errors.

Right now, how I have solved this problem is by doing something like the following:

```python
error_codes = {error.error_code for error in exception.failure.errors}

authentication_error = client.get_type('AuthenticationErrorEnum', version='v1')
customer_not_found_error = authentication_error_enum.CUSTOMER_NOT_FOUND in error_codes
```

Then, I can trigger the different code paths based on this boolean
 Comment 3: @wesleybowman This is horrendous, but here is how i'm doing it.

Working in a python lib that has no built in interfaces or structure and instead by hidden proto files, is extremely difficult. It's been a long time since i couldn't get a single thing off of intellisense.
Pretty miserable.

But here is my crappy way.
```
 Comment 4: @j-walker23 

> It's been a long time since i couldn't get a single thing off of intellisense.
Pretty miserable.

Agreed. It's been a difficult ride. What we ended up going with for now is the following:

```python
        client = get_google_ads_client()
        authentication_error_enum = client.get_type('AuthenticationErrorEnum', version='v1')
        authorization_error_enum = client.get_type('AuthorizationErrorEnum', version='v1')
        request_error_enum = client.get_type('RequestErrorEnum', version='v1')

        for error in exception.failure.errors:

            error_code = error.error_code

            if error_code.authentication_error == authentication_error_enum.CUSTOMER_NOT_FOUND:
                raise AdwordsPermissionError('Customer Not Found', exception)

            elif error_code.authorization_error == authorization_error_enum.USER_PERMISSION_DENIED:
                raise AdwordsPermissionError('User Permission Denied', exception)

            elif error_code.request_error == request_error_enum.INVALID_CUSTOMER_ID:
                raise AdwordsInvalidClientCustomerId('Invalid Client Customer ID', exception)
```

Overall, fairly simple, but I am hoping there will be a better way in the future
 Comment 5: Awesome, thanks for the reply tip!

On Wed, May 1, 2019 at 11:41 PM Wesley Bowman <catherine98@example.net>
wrote:

> @j-walker23 <https://github.com/j-walker23>
>
> It's been a long time since i couldn't get a single thing off of
> intellisense.
> Pretty miserable.
>
> Agreed. It's been a difficult ride. What we ended up going with for now is
> the following:
>
>         client = get_google_ads_client()
>         authentication_error_enum = client.get_type('AuthenticationErrorEnum', version='v1')
>         authorization_error_enum = client.get_type('AuthorizationErrorEnum', version='v1')
>         request_error_enum = client.get_type('RequestErrorEnum', version='v1')
>
>         for error in exception.failure.errors:
>
>             error_code = error.error_code
>
>             if error_code.authentication_error == authentication_error_enum.CUSTOMER_NOT_FOUND:
>                 raise AdwordsPermissionError('Customer Not Found', exception)
>
>             elif error_code.authorization_error == authorization_error_enum.USER_PERMISSION_DENIED:
>                 raise AdwordsPermissionError('User Permission Denied', exception)
>
>             elif error_code.request_error == request_error_enum.INVALID_CUSTOMER_ID:
>                 raise AdwordsInvalidClientCustomerId('Invalid Client Customer ID', exception)
>
> Overall, fairly simple, but I am hoping there will be a better way in the
> future
>
> —
> You are receiving this because you were mentioned.
> Reply to this email directly, view it on GitHub
> <https://github.com/googleads/google-ads-python/issues/83#issuecomment-488558655>,
> or mute the thread
> <https://github.com/notifications/unsubscribe-auth/AAPM4RPEYBY6KIYPVOVLDVLPTJ5IFANCNFSM4HGSNKNQ>
> .
>

 Comment 6: @j-walker23 @wesleybowman Thanks for coordinating with each other, and sorry for my delayed response. Is it accurate to describe the issue you're having generally as wanting to lookup the string name of an Enum field using the integer value pulled from a request object?

It looks like that's the core problem - if not, or if I'm leaving off other problems, please add on here.

The issue of doing this type of look up is definitely a major pain point. It's possible to do this a bit more easily by using the protobuf helpers, like this:

```python
from google.protouf.json_format import MessageToDict

# e is GoogleAdsException
failure = e.failure
dict = MessageToDict(failure)

for error in dict['errors']:
    error_code = error['errorCode']

    if error_code['authenticationError'] == 'CUSTOMER_NOT_FOUND':
        raise AdwordsPermissionError('Customer Not Found', exception)

    if error_code['authorizationError'] == 'USER_PERMISSION_DENIED':
        raise AdwordsPermissionError('User Permission Denied', exception)

    if error_code['requestError'] == 'INVALID_CUSTOMER_ID':
        raise AdwordsInvalidClientCustomerId('Invalid Client Customer ID', exception)
```

Admittedly it's not a _whole_ lot better, but at least you don't need to deal with the Enum protos directly.

One caveat about this solution is that it will generate errors if you are retrieving resource fields that contain a digit following an underscore, for example: `video_quartile_25_rate`. See this separate issue for more context: https://github.com/googleads/google-ads-python/issues/30

I'm hoping to get functionality added to this library that will more easily expose the Enum field names so external helpers like `MessageToDict` aren't necessary. Hopefully that will come in the near future.

Let me know if you have any additional questions or thoughts here.
 Comment 7: > I'm hoping to get functionality added to this library that will more easily expose the Enum field names so external helpers like `MessageToDict` aren't necessary. Hopefully, that will come in the near future.

This would be wonderful!

> and sorry for my delayed response.

No worries! We know you guys are busy. Keep up the good work :+1: 


> Admittedly it's not a whole lot better, but at least you don't need to deal with the Enum protos directly.

I would like to extend this to also include an easier way to convert the `StatusEnum` into it's name instead of an `int`. For example, currently, to get the status as a string, we do the following:

```python
campaign_status_enum = client.get_type('CampaignStatusEnum', version='v1').CampaignStatus.Name
for row in results:
    status: str = campaign_status_enum.CampaignStatus.Name(row.campaign.status)
```

IMHO, it would be nice if `row.campaign.status` had a value and name that could be accessed.
 Comment 8: @wesleybowman Thank you for the explanation! I'm working on determining if there's a way that we can improve the interface for this. To be honest it won't be an easy change, so it might take some time. I'm going to close this issue since it's not directly related, but I'll open a new one to track progress against making Enums easier to work with.
{'source': 'GithubIssues', 'repo_name_with_owner': 'googleads/google-ads-python', 'issue_id': 434182246, 'repo_stars': 314.0}