BUG: usecols kwarg accepts string when it should only allow list-like or callable.
- [x] closes #20529 
- [x] tests added / passed
- [x] passes `git diff upstream/master -u -- "*.py" | flake8 --diff`
- [x] whatsnew entry

Since string is iterable, when passed into usecols in read_csv or read_table, it is currently treated as array of characters instead of being caught properly. For example, when usecols='bar', it is interpreted as ['b', 'a' ,'r'] in TextReader, and raising a column not found error in _validate_usecols_names when it really should raise ValueError as invalid value from _validate_usecols_arg, before the param being passed into TextReader.

It's a bug in _validate_usecols_arg and TextReader which lack handling of string-type iterable.

```
>>> import os
>>> from itertools import repeat
>>> from pandas import *
>>>
>>> dummy = DataFrame({"foo": range(0, 5),
...                    "bar": range(10, 15),
...                    "b": [1, 2, 3, 5, 5],
...                    "a": list(repeat(3, 5)),
...                    "r": list(repeat(8, 5))})
>>>
>>> dummy.to_csv('dummy.csv', index=False)
>>> read_csv('dummy.csv', usecols=['foo'])
   foo
0    0
1    1
2    2
3    3
4    4
>>> read_csv('dummy.csv', usecols='bar')
   b  a  r
0  1  3  8
1  2  3  8
2  3  3  8
3  5  3  8
4  5  3  8
>>>
>>> os.remove('dummy.csv')
```


Added is_list_like check in _validate_usecols_arg to ensure passed value is list-like but not string. Also, array_like is defined as list_like with dtype attribute so update docstring to list-like from array-like.