first stab at ads

Do not merge yet,
For review only now
callback is an object and not a function? this is confusing. Probably shouldn't be named callback if the actual callback is in it's `fn` property