code: func ValuesAndContext(keyvals []interface{},
  	keys ...interface{}) (map[string]interface{}, []interface{}) {
  
  	vals := make(map[string]interface{}, len(keys))
  	context := make([]interface{}, len(keyvals))
  	copy(context, keyvals)
  	deletions := 0
  	// We can't really do better than a linear scan of both lists here. N is small
  	// so screw the asymptotics.
  	// Guard against odd-length list
  	for i := 0; i < 2*(len(keyvals)/2); i += 2 {
  		for k := 0; k < len(keys); k++ {
  			if keyvals[i] == keys[k] {
  				// Pull the matching key-value pair into vals to return
  				vals[StringifyKey(keys[k])] = keyvals[i+1]
  				// Delete the key once it's found
  				keys = DeleteAt(keys, k)
  				// And remove the key-value pair from context
  				context = Delete(context, i-deletions, 2)
  				// Keep a track of how much we've shrunk the context to offset next
  				// deletion
  				deletions += 2
  				break
  			}
  		}
  	}
  	return vals, context
  }
docs: // Pull the specified values from a structured log line into a map.
  // Assumes keys are single-valued.
  // Returns a map of the key-values from the requested keys and
  // the unmatched remainder keyvals as context as a slice of key-values.