allow array to be updated using `obs.set`

Currently `obs.set` simply falls back to observ's notify method, so if you call set on an observ-array everything just breaks. Trouble is, it appears to work, but the inner `._list` is never updated. This behavior is not really ideal and quite confusing. 

The new `transaction` method just about does what we want here, minus the initial shallow copy. This PR extracts out the update portion of transaction to a new `obs.set` method allowing the inner `._list` to be updated using `obs.set(rawList)`.

@Raynos I think this behavior of `set` makes more sense. What do you think?