ENH: Rename multi-level columns or indices using their tupelized names
It's currently quite difficult to rename a single column (or row) in a multi-indexed DataFrame. The problem is illustrated also in this [SO article](https://stackoverflow.com/questions/54693188).

The current approach requires at least 3 steps:

```
df = pd.DataFrame([[1,2,3],[3,4,5],[5,6,7], [7,8,9]])
df.columns = pd.MultiIndex.from_tuples([('i','a'),('i','b'),('ii','a')])

# Alternative 1
i = df.columns.get_loc(('i','b'))
cols = df.columns.values
cols[i] = ('i','c')
df.columns = pd.MultiIndex.from_tuples(cols)

# Alternative 2
df.columns = df.columns.to_flat_index()
df = df.rename(columns={('i','b'):('i','c')})
df.columns = pd.MultiIndex.from_tuples(df.columns)
```

#### Enhancement:

In presence of a MultiIndex, `rename()` should support the tupelized representation of a column.

```
df = pd.DataFrame([[1,2,3],[3,4,5],[5,6,7], [7,8,9]])
df.columns = pd.MultiIndex.from_tuples([('i','a'),('i','b'),('ii','a')])

# Rename using tuples:
df.rename(columns={('i','b'):('ii','b')})
# Rename using current column name (equivalent to 1a)
col = df[('i','b')]
df.rename(columns={col.name: ('ii','b')})
```

This would improve the consistency of the API, since many methods accept a tuple to address the name of a multi-index element:

```
df[('i','a')]
df.drop(('i','a'), axis=1)
df.pop(('i','a'), axis=1)
...
```

#### API breaking implications

I regard this improvement as an extension of the current API.


