setState can now receive a callback as first arg

Also -> Bug fix: Models are not marked as `$dirty` if they do not have
new state. Note that private fields (i.e. fields starting with an
underscore) do not mark a Model as `$dirty` if their state changes as
these fields do not persist to the backend