Fix py3 test failure for cloudsearch customizations

The issue is two fold.

1. We're flattening a top level expression, but replacing it with a
   nested parameter.  That is, "expression" is the top level key, but
   we want to flatten "ExpressionValue" to "expression", which is the
   same name.  There's a bug in the code where we lookup the arg table
   every time we flatten an arg.  In order to fix this, ExpressionValue
   (the thing taking the same name as the top level arg) needs to be
   last.
2. Point 1 shouldn't matter :)  We should take a reference to the
   argument object from the arg_table and use that for the duration
   of the replacement of any argument we flatten under that top level
   key.

We ran into this bug because with py3's hash randomization we're not
guaranteed to iterate over the flattened args in-order.  So I switch
to an OrderedDict.  I also implemented (2), which is to keep a reference
to the argument object while flattening nested args associated with the
same top level param.

Verified that running the tests in a loop 20 times didn't generate
any test failures.

cc @danielgtaylor