encoder: Support full range of pointer data types

With surprise I discovered that `pg` can encode pointers to ints and strings, but not to `time.Time`. Turns out, after a pointer is dereferenced (`Elem()`), the value is passed to `appendValue` function, which knows nothing about `time.Time` and some other types.

This pull request moves pointer dereferencing from `appendValue` to `appendIface`. As a result, it is now possible to encode `*time.Time` among other things.