Added record() functionality to accept dynamic names

In response to https://github.com/quantopian/qexec/issues/3142

Added functionality for record to accept positional args of the form (str1, value1, str2, value2, ... ) before the keyword arguments. This enables the user to record values with names defined by dynamic strings rather than hardcoding.

This PR is a precursor to a qexec PR which enables full functionality of this feature through the API. I'll submit the qexec PR as soon as this PR has been merged.
There's a little bit of magic happening here: You create two copies of an iterator, then create a list of pairs by zipping the same iterator together.  It'd be easy to read this and think that it duplicates the values (i.e. `[(a0, a0), (a1, a1), ...]`) as opposed to iterating in pairs (i.e. `[(a0, a1), (a2, a3), ...]`, so a comment explaining what's happening and why might be helpful.