async derived properties (#117)

When `async: true` is passed as part of the property definition, the
`fn` property takes a `done` callback that must be called once the async method
is finished to apply the new value.

keeps track when a property is updating to prevent multiple calls to
async property functions, so this means no matter what the async
function has to call `done`. As soon as done is called, the property is
marked as no longer updating - before applying the new value. This
ensures any changes that trigger another async update can succeed.