Correct Async.from_dict to not mutate source options dict.

Async.from_dict mutated the options passed in as the argument.  Such
unexpected mutations are not friendly and may be dangerous.
Transplant encode / decode callback logic to job_utils.

The callback encoding logic is required by other objects as well, such
as Context.  Because of this, they should be split into a more "neutral"
location than async.py.