BUG: Raise clear error when assign is used with non-string column keys
### What does this PR do?

Fixes confusing behavior when `.assign()` is used with non-string keys like tuples. Python raises a generic `TypeError: keywords must be strings`, which confuses users.

This PR adds a more helpful message:
> assign() only supports string column names. Use df[('C', 'one')] = ... to assign non-string column names like tuples.

### Why?

This improves the developer experience and avoids unnecessary debugging time.

### How was this fixed?

- Added `__kwargs_dict__` as a keyword-only argument for testing with tuple keys
- Added validation in `assign()` for string-only keys
- Updated existing test for compatibility
- Added new test: `test_assign_with_tuple_column_key_raises_typeerror`

### Test added

 `test_assign_with_tuple_column_key_raises_typeerror`

Thanks for the PR, but it appears there a lot of changes in unrelated files. Going to close this PR, but ensure that pull requests are made from the latest commit on main