Add assign()

The call signature here should be something like:

```python
def assign(obj, *sources, **kargs):
    callback = kargs.get('callback')
    # also handle callback passed in as last of *sources
    ...
```

Basically, `sources` needs to be positional args and `callback` needs to be a positional or keyword arg.