use base_uri not baseuri and app_id not appid in yml
spec s/baseuri/base_uri/g s/appid/app_id/g
README s/baseuri/base_uri/g s/appid/app_id/g
Add common FluidFeatures client exceptions
do not setup sending transactions loop until first transaction
only use persisted state as fallback, not default

do not setup update receiver loop until our first
request for the data.

on first request for data, get data directly from api
in the foreground and start background receiver loop.

on first request for data, if data can not be received
directly from api, then get from persisted state, then
if no persisted state throw exception.
storage should return nil if it has no data, not {}

create and new should accept logger object, rather than
expecting it in the config
FluidFeatures.app accepts logger obj, not via config
raise exception when base_uri is not a String
Storage.new accepts logger obj, not via config
refactored FluidFeatures::Config...

-    def initialize(path, environment, replacements = {})
+    def initialize(source, environment=nil)

source is either a Hash or a file path String.
dropped replacements.
environment is only expected when source point to yaml file.
source as Hash should environment specifics, not all environments
hierachy

General refactoring of initialize and parse_file_size
do not require ENV variables for spec tests
fix test persistence/features_spec. null instance returns nil
move @features_lock.synchronize to wrapper function
move @buckets_lock.synchronize to wrapper method

make buckets_lock_synchronize and features_lock_synchronize
@private methods
shorter file_size method

added TODO for returning nil on rescue
use @var instead of self.var
add stop_sending stop_receiving to reporter and state
always replace persisted state. do not check changed

if should only be set if changed.
'==' does not do a deep comparison.
add wait=bool to stop_(sending|receiving)

run_loop verifies that it should be running and that
it is not already running before starting