Creates a copy of the data map when using WithContext to create a
child entity. Without this, the data map of the parent entitiy,
which is exposed in the entity struct, is shared between a parent
and all children instances.
This can create bugs of shared or overwritten data when a parent
entity is used to make children in differing contexts, and behaves
differently than `WithField` and its diritivites which does make
a copy of the data.
Additionally implements the same logic for WithTime, for API
consistency in behavior.
When calling Entry.log a panic inside some of the
locking blocks could cause the whole logger to deadlock.
One of the ways this could happen is for a hook to cause
a panic, when this happens the lock is never unlocked and
the library deadlocks, causing the code that is calling
it to deadlock as well.
This changes how locking happens with unlocks at defer
blocks so even if a panic happens somewhere along the log
call the library will still unlock and continue to function.